web-dev-qa-db-fra.com

python - Recherche du dossier "Téléchargements" de l'utilisateur

J'ai déjà trouvé cette question qui suggère d'utiliser os.path.expanduser(path) pour obtenir le répertoire personnel de l'utilisateur.

Je voudrais réaliser la même chose avec le dossier "Téléchargements". Je sais que c'est possible en C # , pourtant je suis nouveau à Python et je ne sais pas si c'est possible ici aussi, préférable indépendant de la plateforme (Windows , Ubuntu).

Je sais que je pourrais simplement faire download_folder = os.path.expanduser("~")+"/Downloads/", pourtant (au moins sous Windows) il est possible de changer le dossier de téléchargement par défaut .

14
Markus Weninger

La localisation correcte des dossiers Windows est en quelque sorte une corvée en Python. Selon les réponses couvrant les technologies de développement Microsoft, telles que celle-ci , elles doivent être obtenues à l'aide de Vista API de dossier conn . Cette API n'est pas enveloppée par la bibliothèque standard Python (bien qu'il y ait n problème de 2008 le demande)), mais on peut utiliser le module ctypes pour y accéder quand même.

L'adaptation de la réponse ci-dessus pour utiliser l'ID de dossier pour les téléchargements illustré ici et la combiner avec votre code Unix existant devrait donner un code qui ressemble à ceci:

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")

Un module plus complet pour récupérer les dossiers connus de Python est disponible sur github .

8
user4815162342

Cette solution assez simple (développée à partir de this reddit post) a fonctionné pour moi

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')
  • Le GUID peut être obtenu auprès de Microsoft KNOWNFOLDERID docs
  • Cela peut être étendu pour fonctionner de manière plus générique avec d'autres répertoires
11
Alexander McFarlane

Pour python3 + mac ou linux

from pathlib import Path
path_to_download_folder = str(os.path.join(Path.home(), "Downloads"))
2
Jeff WR
import os

download_path='/'.join( os.getcwd().split('/')[:3] ) + '/Downloads' 

0
Joao Vitor Deon