在Python中查找系统文件夹位置

11

我正在尝试使用Python 3.1查找系统文件夹的位置。例如,"我的文档" = "C:\Documents and Settings\User\My Documents","程序文件" = "C:\Program Files"等等。

5个回答

9
我发现了另一种略有不同的方法。这种方法将为您提供各种系统文件夹的位置,并使用实际单词而非 CLSID。
import win32com.client
objShell = win32com.client.Dispatch("WScript.Shell")
allUserDocs = objShell.SpecialFolders("AllUsersDesktop")
print allUserDocs

其他可用的文件夹包括:AllUsersDesktop(所有用户桌面)、AllUsersStartMenu(所有用户开始菜单)、AllUsersPrograms(所有用户程序)、AllUsersStartup(所有用户启动)、Desktop(桌面)、Favorites(收藏夹)、Fonts(字体)、MyDocuments(我的文档)、NetHood(网络邻居)、PrintHood(打印邻居)、Recent(最近使用)、SendTo(发送到)、StartMenu(开始菜单)、Startup(启动)和Templates(模板)。


这个库有文档吗?SourceForge网站只是一个横幅广告和空白维基的迷宫。我正在寻找程序文件目录(或者至少在Windows下曾经被称为这样...谢天谢地,我已经很久没有处理Windows了)。'AllUsersPrograms'似乎返回开始菜单下的“程序”路径(有趣的是,因为我不确定我是否在Windows Server 2012中找到了开始菜单!) - Michael Scheper
@MIchael Scheper,恐怕自从我提出这个问题以来,我就没有再碰过它了,而且SourceForge自那时以来已经严重下滑。也许可以尝试检查objShell,看看是否有一种方法可以查看所有SpecialFolder名称? - Mr_Chimp
@MichaelScheper,我发现最易懂、最易理解的参考资料是SS64 - https://ss64.com/vb/special.html,该网站还提供了完整细节的来源引用。 - matt wilkie

7
在Windows 7中,我可以使用以下环境变量来访问我需要的文件夹:
>>> import os
>>> os.environ['USERPROFILE']
'C:\\Users\\digginc'
>>> os.environ['PROGRAMFILES']
'C:\\Program Files'

我目前使用的是7,它运行得很好。你知道这在跨平台使用时有多可靠吗?文档帮助不大。谢谢。 - Mr_Chimp
很抱歉,猩猩先生,我不知道。 - cdiggins
@Mr_Chimp:完全不跨平台,这些是仅在Windows中设置的环境变量。 - undefined

4

要获取"My Documents"文件夹,您可以使用以下代码:

from win32com.shell import shell
df = shell.SHGetDesktopFolder()
pidl = df.ParseDisplayName(0, None,  
    "::{450d8fba-ad25-11d0-98a8-0800361b1103}")[1]
mydocs = shell.SHGetPathFromIDList(pidl)
print mydocs

来源在这里.

我不确定“Program Files”等价的魔法咒语是什么,但这应该足以让您开始了。


在Python <3中,是的。 在Python 3.1中:
from win32com.shell import shell Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> from win32com.shell import shell ImportError: 没有名为win32com.shell的模块
- Mr_Chimp
2
win32com已安装吗?Python 3.1有可用的版本(请参见http://sourceforge.net/projects/pywin32/files/)。 - Dominic Rodger

3

从Vista开始,用于此操作的Windows API调用是SHGetKnownFolderPath。这里有一个使用ctypes编写的MIT许可包装器(因此不依赖于pywin32)此处

>>> from knownpaths import *
>>> get_path(FOLDERID.ProgramFilesX86)
u'C:\\Program Files (x86)'

哈哈!如果我几个小时前注意到这篇没有投票的帖子,我就不会写我的了。如果可以的话,+5分。 - matt wilkie

0

这里有一个替代性的 win32com 方法,因为WScript.Shell“特殊文件夹并不适用于所有语言环境,首选的方法是从用户Shell文件夹查询值”(ref):

>>> ID = 48
>>> shapp = win32com.client.Dispatch("Shell.Application")
>>> shapp.namespace(ID).self.path
'C:\\Users\\mattw\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Administrative Tools'

该ID号来自MSDN ShellSpecialFolderConstants枚举。我将该列表转换为CSV以便于使用,并编写了一个简短的Python脚本进行演示,代码片段在此

特别感谢Chimp先生的启动。我在开始时非常依赖他的答案和参考资料。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接