我在用:
for root, dirs, files in os.walk(rootDir):
浏览目录。 都很酷。 但是,我正在运行的Windows 7,当然有图书馆抽象。 因此,例如图片库可能映射到c:\users\me
和c:\users\share
有什么办法,我可以用这个库抽象与Python?
除非我错了这个功能是如何工作的(我实际上没有一个Win7的盒子),你将不得不访问Windows Shell API来访问库。
阅读MSDN杂志上的图书馆介绍 ,似乎很清楚,刚刚处理文件系统的应用程序会将库视为普通目录,甚至没有任何关于组成库的分散目录。 除非你总是坚持花哨的文件选择器对话框来获取所有的路径(在这种情况下,用户可以看到库,但总是选择一个特定的文件夹,所以你不必处理库),你必须明确地使用shell API。
我想你想开始在Windows库的开发指南和IShellLibrary的参考。
这些显然是COM API,所以你可能想用win32com
来从Python访问它们。 (你可以使用ctypes
处理COM的东西C风格,但是你真的不想这么做。)有人可能已经把这些COM对象封装在一个漂亮的Python接口中了 – 我没有找到任何东西PyPI和ActiveState搜索,但您可能想尝试更严肃的搜索。
另外,当然,你可以使用IronPython并使用.NET API而不是本地的API。
Pywin32(218)的最新版本支持shell库接口:
import pythoncom from win32com.shell import shell, shellcon from win32com import storagecon import os kfm = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager) libs_folder = kfm.GetFolder(shell.FOLDERID_Libraries) libs_path = libs_folder.GetPath() for lib_file in os.listdir(libs_path): if os.path.splitext(lib_file)[1] == '.library-ms': print lib_file i = shell.SHCreateItemFromParsingName(os.path.join(libs_path, lib_file), None, shell.IID_IShellItem) lib = pythoncom.CoCreateInstance(shell.CLSID_ShellLibrary, None, pythoncom.CLSCTX_INPROC, shell.IID_IShellLibrary) lib.LoadLibraryFromItem(i, storagecon.STGM_READ) for folder in lib.GetFolders(): print '\t' + folder.GetDisplayName(shellcon.SHGDN_FORPARSING)