2021-04-07 Python 获取“我的文档”等win系统路径的几种方法
发布日期:2021-05-04 07:31:31 浏览次数:35 分类:原创文章

本文共 10315 字,大约阅读时间需要 34 分钟。

ctypes.wintypes

import ctypes.wintypesdef getDocPath(pathID=5):    '''path=5: My Documents'''    buf= ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH)    ctypes.windll.shell32.SHGetFolderPathW(None, pathID, None, 0, buf)    return buf.valuefor i in range(60):    print(i,getDocPath(i))print('\nMy Documents\' Path:',end='\n\t')print(getDocPath())

 运行结果:(可以得到几十种windows系统路径)

0 C:\Users\Administrator\Desktop

2 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs


5 d:\Documents
6 d:\Favorites
7 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
8 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Recent
9 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\SendTo
10 
11 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu
12 
13 C:\Users\Administrator\Music
14 C:\Users\Administrator\Videos
15 
16 C:\Users\Administrator\Desktop
17 
18 
19 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Network Shortcuts
20 C:\Windows\Fonts
21 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Templates
22 C:\ProgramData\Microsoft\Windows\Start Menu
23 C:\ProgramData\Microsoft\Windows\Start Menu\Programs
24 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
25 C:\Users\Public\Desktop
26 C:\Users\Administrator\AppData\Roaming
27 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
28 C:\Users\Administrator\AppData\Local
29 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
30 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
31 d:\Favorites
32 C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary Internet Files
33 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies
34 C:\Users\Administrator\AppData\Local\Microsoft\Windows\History
35 C:\ProgramData
36 C:\Windows
37 C:\Windows\system32
38 C:\Program Files
39 d:\Pictures
40 C:\Users\Administrator
41 C:\Windows\SysWOW64
42 C:\Program Files (x86)
43 C:\Program Files\Common Files
44 C:\Program Files (x86)\Common Files
45 C:\ProgramData\Microsoft\Windows\Templates
46 C:\Users\Public\Documents
47 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
48 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
49 
50 
51 
52 
53 C:\Users\Public\Music
54 C:\Users\Public\Pictures
55 C:\Users\Public\Videos
56 C:\Windows\resources
57 C:\Windows\resources\0804
58 C:\ProgramData\OEM Links
59 C:\Users\Administrator\AppData\Local\Microsoft\Windows\Burn\Burn

My Documents' Path:
    d:\Documents

win32com.shell

from win32com.shell import shelldef getDocPath(pathID=5):    try:        return shell.SHGetFolderPath(0, pathID, None, 0)    except:        return ''for i in range(60):    print(i,getDocPath(i))print('\nMy Documents\' Path:',end='\n\t')print(getDocPath())

运行结果:(同 ctypes.windll.shell32.SHGetFolderPathW() 返回的完全一致,但本函数 win32com.shell.SHGetFolderPath() 若pathID不存在会报错退出,所以用了try...except语句)

0 C:\Users\Administrator\Desktop

2 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs


5 d:\Documents
6 d:\Favorites
7 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
8 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Recent
9 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\SendTo
10 
11 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu
12 
13 C:\Users\Administrator\Music
14 C:\Users\Administrator\Videos
15 
16 C:\Users\Administrator\Desktop
17 
18 
19 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Network Shortcuts
20 C:\Windows\Fonts
21 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Templates
22 C:\ProgramData\Microsoft\Windows\Start Menu
23 C:\ProgramData\Microsoft\Windows\Start Menu\Programs
24 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
25 C:\Users\Public\Desktop
26 C:\Users\Administrator\AppData\Roaming
27 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
28 C:\Users\Administrator\AppData\Local
29 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
30 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
31 d:\Favorites
32 C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary Internet Files
33 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies
34 C:\Users\Administrator\AppData\Local\Microsoft\Windows\History
35 C:\ProgramData
36 C:\Windows
37 C:\Windows\system32
38 C:\Program Files
39 d:\Pictures
40 C:\Users\Administrator
41 C:\Windows\SysWOW64
42 C:\Program Files (x86)
43 C:\Program Files\Common Files
44 C:\Program Files (x86)\Common Files
45 C:\ProgramData\Microsoft\Windows\Templates
46 C:\Users\Public\Documents
47 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
48 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
49 
50 
51 
52 
53 C:\Users\Public\Music
54 C:\Users\Public\Pictures
55 C:\Users\Public\Videos
56 C:\Windows\resources
57 C:\Windows\resources\0804
58 C:\ProgramData\OEM Links
59 C:\Users\Administrator\AppData\Local\Microsoft\Windows\Burn\Burn

My Documents' Path:
    d:\Documents

os.path

用函数os.path.expanduser('~') 或者:os.path.expandvars('$HOME') 获取用户路径

>>> from os import path>>> path.expanduser('~')'C:\\Users\\Administrator'>>> os.path.expandvars('$HOME')'C:\\Users\\Administrator>>> path.expanduser('~\Desktop')'C:\\Users\\Administrator\\Desktop'>>> docPath=path.expanduser('~\Documents')>>> docPath'C:\\Users\\Administrator\\Documents'>>> 

比较简短,但不是很方便。其对应的参数是系统路径的文本不是数字,且只是系统用户名下的默认路径。

import os.pathdef getDocPath():    return os.path.expanduser('~\Documents')print(getDocPath())

configparser.ConfigParser

由os.system()从环境变量中获取路径写入.ini文件,用函数ConfigParser()来读取(需要安装configparser库)。

E:\>pip install ConfigParser
Collecting ConfigParser
  Downloading configparser-5.0.2-py3-none-any.whl (19 kB)
Installing collected packages: ConfigParser
Successfully installed ConfigParser-5.0.2

import osimport configparserdef getDocPath():    os.system("@echo [HOME]>c:\home.ini")    os.system("@set HOME>>c:\home.ini")    config = configparser.ConfigParser()    config.read_file(open(r'c:\home.ini'))    path = config.get("HOME","HOME")    os.remove(r'c:\home.ini')    return path + '\Documents'print(getDocPath())

 os.getenv

用函数os.getenv('HOME']) 或者os.environ['HOME']直接获取环境变量,不用读写ini文件。

注意:两者所用括号的区别,后者不是函数而是字典,os.environ 返回全部环境变量。

>>> import os>>> os.getenv("HOME")'C:\\Users\\Administrator'>>> os.environ['HOME']'C:\\Users\\Administrator'>>> os.environenviron({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 'ASL.LOG': 'Destination=file', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'PC-20160915', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'FP_NO_HOST_CHECK': 'NO', 'FREI0R_PATH': 'C:\\Program Files (x86)\\APOWER~1\\VIDEOC~1\\frei0r;C:\\Program Files (x86)\\Apowersoft\\Video Converter Studio\\frei0r', 'HOME': 'C:\\Users\\Administrator', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\Administrator', 'LNKEVN': 'C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe', 'LOCALAPPDATA': 'C:\\Users\\Administrator\\AppData\\Local', 'LOGONSERVER': '\\\\PC-20160915', 'MOZ_PLUGIN_PATH': 'C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\plugins\\', 'NUMBER_OF_PROCESSORS': '2', 'OS': 'Windows_NT', 'PATH': 'C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files\\Calibre2\\;C:\\Program Files (x86)\\Microsoft SQL Server\\100\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\100\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\100\\DTS\\Binn\\;E:\\Python\\Scripts\\;E:\\Python\\;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Launcher\\;E:\\PyCharm\\bin;', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 23 Stepping 10, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '170a', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM COMMUNITY EDITION': 'E:\\PyCharm\\bin;', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'USERDOMAIN': 'PC-20160915', 'USERNAME': 'Administrator', 'USERPROFILE': 'C:\\Users\\Administrator', 'VS100COMNTOOLS': 'C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\Tools\\', 'WINDIR': 'C:\\Windows', 'WINDOWS_TRACING_FLAGS': '3', 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', '_DFX_INSTALL_UNSIGNED_DRIVER': '1'})>>> 
import osdef getDocPath():    return os.getenv("home")+'\Documents'def getDesktopPath():    return os.getenv("home")+'\Desktop'print(getDocPath())print(getDesktopPath())

winreg.OpenKey

从注册表中读取,“我的文档”是个特殊键,键值为:  {374DE290-123F-4565-9164-39C4925E467B}

import winregdef getDocPath():    key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')    return winreg.QueryValueEx(key, "{374DE290-123F-4565-9164-39C4925E467B}")[0]print(getDocPath())

由以下截图可以看出“桌面”可以用'Desktop'来获取;“我的文档”除了上面那个特殊值也能用'Personal'代替。

 

综上这么几种方法,比较倾向于推荐前二种方法! 总结代码如下:

from os import path as pimport ctypes.wintypes def getDocPath(pathID=5):    '''默认返回我的文档路径,buf为空则返回当前工作路径'''    buf= ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH)    ctypes.windll.shell32.SHGetFolderPathW(None, pathID, None, 0, buf)    return p.dirname(p.realpath(__file__)) if buf.value=='' else buf.value print(getDocPath())print(getDocPath(60))

或者:

import osfrom win32com.shell import shelldef getDocPath(pathID=5):    '''默认返回我的文档路径,出错则返回当前工作路径'''    try:        return shell.SHGetFolderPath(0, pathID, None, 0)    except:        return os.path.dirname(os.path.realpath(__file__))print(getDocPath())print(getDocPath(60))

 

上一篇:2021-04-10 昨天、今天、明天|Python用datetime库自定义函数返回日期格式字符串
下一篇:2021-04-05 用Python改编 “160字符C程序计算Pi前800位”

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月29日 23时53分14秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章