查找用户的"我的文档"路径

30 python

我有这个小程序,它需要在"我的文档"文件夹中创建一个小的.txt文件.这是我的代码:

textfile=open('C:\Users\MYNAME\Documents','w')
lines=['stuff goes here']
textfile.writelines(lines)
textfile.close()
Run Code Online (Sandbox Code Playgroud)

问题是,如果其他人使用它,我该如何更改MYNAME他们的帐户名称?

Joe*_*Joe 38

使用os.path.expanduser(path),请参阅http://docs.python.org/library/os.path.html

例如 expanduser('~/filename')

根据文档,这适用于Unix和Windows.

编辑:由于Sven的评论而转发斜线.

  • 在Windows上,`os.path.expanduser('〜/ filename')`调用产生类似`'C:\\ Documents and Settings \\ <username>/filename'`的东西,它不是*不是*的路径用户的"我的文档"文件夹. (9认同)
  • 最好在路径中使用正斜杠:`'〜/ filename'.否则,你会得到意想不到的结果,例如`'〜\name'`,其中`\n`将被替换为换行符. (7认同)
  • 请注意,如果用户移动了“我的文档”文件夹,使其不再位于“〜”下方(例如,如果它位于网络共享或其他驱动器上),则此功能“不起作用”。 (2认同)
  • 这不起作用.你需要的是`df = shell.SHGetDesktopFolder()pidl = df.ParseDisplayName(0,None,":: {{{{450d8fba-ad25-11d0-98a8-0800361b1103}")[1] mydocs = shell.SHGetPathFromIDList(pidl)` (2认同)

axi*_*xil 15

这没有任何额外的库:

import ctypes.wintypes
CSIDL_PERSONAL = 5       # My Documents
SHGFP_TYPE_CURRENT = 0   # Get current, not default value

buf= ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH)
ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf)

print(buf.value)
Run Code Online (Sandbox Code Playgroud)

如果用户更改了文档位置和/或默认保存位置,也可以使用.


mar*_*eau 5

在Windows上,您可以使用类似于接受的问题答案中显示的内容:Python,获取当前登录用户的Windows特殊文件夹.

对于My Documents文件夹路径,请shellcon.CSIDL_PERSONALshell.SHGetFolderPath()函数调用中使用而不是shellcon.CSIDL_MYPICTURES.

因此,假设您安装了PyWin32扩展1,这可能会起作用(请参阅下面的更新部分中的警告):

>>> from win32com.shell import shell, shellcon
>>> shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, None, 0)
u'<path\\to\\folder>'
Run Code Online (Sandbox Code Playgroud)

更新:我刚刚阅读了一些内容,CSIDL_PERSONAL如果用户更改了Win7文档库中的默认保存文件夹,则表示不会返回正确的文件夹.这是指您可以在库的"属性"对话框中执行的操作:

库属性对话框的屏幕截图
选中标记表示路径被设置为默认保存位置.

我目前不知道SHLoadLibraryFromKnownFolder()通过PyWin32 调用函数的方法(目前还没有shell.SHLoadLibraryFromKnownFolder.但是应该可以使用ctypes模块来实现).

1最新版本的Python for Windows Extensions的安装程序目前可从以下网址获得:http:   //sourceforge.net/projects/pywin32