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 #, mais je suis nouveau sur Python et je ne Je ne sais pas si cela est possible ici aussi, de préférence indépendant de la plate-forme (Windows, Ubuntu).

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

13
Markus Weninger 7 mars 2016 à 21:34

4 réponses

Meilleure réponse

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 celui-ci, ils doivent être obtenus à l'aide du Vista API de dossier connu. Cette API n'est pas encapsulée par la bibliothèque standard Python (bien qu'il y ait un problème de 2008 le demandant), mais on peut utiliser le module ctypes pour y accéder quand même.

Adaptation de la réponse ci-dessus pour utiliser l'ID de dossier pour les téléchargements montré ici et en le combinant 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 des dossiers connus à partir de Python est disponible sur github.

7
Community 23 mai 2017 à 12:25
import os

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

-1
Joao Vitor Deon 21 juin 2019 à 20:55

Pour python3 + mac ou linux

from pathlib import Path
path_to_download_folder = str(os.path.join(Path.home(), "Downloads"))
2
Jeff WR 28 oct. 2019 à 22:07

Cette solution assez simple (développée à partir de cette publication Reddit) 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 { {X0}} documents
  • Cela peut être étendu pour fonctionner de manière plus générique avec d'autres répertoires
11
Alexander McFarlane 9 févr. 2018 à 12:50