python-Поиск папки "Загрузки" пользователя

Я уже нашел этот вопрос что предлагает использовать os.path.expanduser(path) чтобы получить домашний каталог пользователя.

Я хотел бы добиться того же с папкой "загрузки". Я знаю это это возможно в C#, но я новичок в Python и не знаю, возможно ли это и здесь, предпочтительно независимо от платформы (Windows, Ubuntu).

Я знаю, что я мог сделать download_folder = os.path.expanduser("~")+"/Downloads/", еще (по крайней мере в Windows) можно изменить значение по умолчанию скачать папку.

2 ответов


правильное расположение папок Windows является чем-то вроде рутины в Python. Согласно ответам, охватывающим технологии разработки Microsoft, такие как этот, они должны быть получены с помощью Vista известная папка API. Этот API не обернут стандартной библиотекой Python (хотя есть выпуск с 2008 года запрашивая его), но можно использовать модуль ctypes для доступа к нему в любом случае.

адаптация вышеуказанного ответа для использования id папки для загрузки показано здесь и объединение его с существующим кодом Unix должно привести к коду, который выглядит следующим образом:

import os

if os.name == 'nt':
    import ctypes
    from ctypes import windll, wintypes
    from uuid import UUID

    # ctypes GUID copied from MSDN sample code
    class GUID(ctypes.Structure):
        _fields_ = [
            ("Data1", wintypes.DWORD),
            ("Data2", wintypes.WORD),
            ("Data3", wintypes.WORD),
            ("Data4", wintypes.BYTE * 8)
        ] 

        def __init__(self, uuidstr):
            uuid = UUID(uuidstr)
            ctypes.Structure.__init__(self)
            self.Data1, self.Data2, self.Data3, \
                self.Data4[0], self.Data4[1], rest = uuid.fields
            for i in range(2, 8):
                self.Data4[i] = rest>>(8-i-1)*8 & 0xff

    SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath
    SHGetKnownFolderPath.argtypes = [
        ctypes.POINTER(GUID), wintypes.DWORD,
        wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)
    ]

    def _get_known_folder_path(uuidstr):
        pathptr = ctypes.c_wchar_p()
        guid = GUID(uuidstr)
        if SHGetKnownFolderPath(ctypes.byref(guid), 0, 0, ctypes.byref(pathptr)):
            raise ctypes.WinError()
        return pathptr.value

    FOLDERID_Download = '{374DE290-123F-4565-9164-39C4925E467B}'

    def get_download_folder():
        return _get_known_folder_path(FOLDERID_Download)
else:
    def get_download_folder():
        home = os.path.expanduser("~")
        return os.path.join(home, "Downloads")

более полным модулем для извлечения известных папок из Python является доступно на github.


Это довольно простое решение (расширенный вариант этой reddit post) работал на меня

import os

def get_download_path():
    """Returns the default downloads path for linux or windows"""
    if os.name == 'nt':
        import winreg
        sub_key = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'
        downloads_guid = '{374DE290-123F-4565-9164-39C4925E467B}'
        with winreg.OpenKey(winreg.HKEY_CURRENT_USER, sub_key) as key:
            location = winreg.QueryValueEx(key, downloads_guid)[0]
        return location
    else:
        return os.path.join(os.path.expanduser('~'), 'downloads')
  • идентификатор GUID можно получить изKNOWNFOLDERID docs
  • это может быть расширено, чтобы работать более обобщенно других каталогах