查找用户的“我的文档”路径

39 投票
3 回答
56006 浏览
提问于 2025-04-16 18:54

我有一个小程序,它需要在用户的“我的文档”文件夹里创建一个小的 .txt 文件。下面是我为此写的代码:

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

问题是,如果其他人使用这个程序,我该怎么把 MYNAME 改成他们自己的账户名呢?

3 个回答

6

在Windows系统上,你可以使用类似于这个问题的被接受答案中展示的方法:Python,获取当前登录用户的Windows特殊文件夹

如果你想获取我的文档文件夹的路径,可以在shell.SHGetFolderPath()函数中使用shellcon.CSIDL_PERSONAL,而不是shellcon.CSIDL_MYPICTURES

所以,假设你已经安装了PyWin32扩展1,这个方法可能有效(具体情况请看下面的更新部分):

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

更新:我刚刚看到一些内容,提到如果用户在Win7的文档库中更改了默认保存文件夹,CSIDL_PERSONAL将不会返回正确的文件夹。这是指你可以在库的属性对话框中进行的操作:

库属性对话框的截图
勾选框表示该路径被设置为默认保存位置。

目前我不知道如何通过PyWin32调用SHLoadLibraryFromKnownFolder()函数(现在没有shell.SHLoadLibraryFromKnownFolder)。不过,使用ctypes模块应该是可以做到的。

1最新版本的Python for Windows扩展的安装程序可以在这里找到:  http://sourceforge.net/projects/pywin32

30

这个代码可以在没有额外库的情况下正常运行:

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)

如果用户更改了文档的位置或者默认保存的位置,这个代码也能正常工作。

54

使用 os.path.expanduser(path),具体可以查看这个链接:http://docs.python.org/library/os.path.html

比如说,你可以这样用: expanduser('~/filename')

根据文档,这个方法在Unix和Windows系统上都能用。

补充说明:因为Sven的评论,所以这里用了正斜杠。

撰写回答