Saltar al contenido

python – Encontrar la carpeta “Descargas” del usuario

Este escrito ha sido aprobado por nuestros expertos así garantizamos la exactitud de esta sección.

Solución:

Esta solución bastante simple (ampliada de esta publicación de reddit) funcionó para mí

import os

def get_download_path():
    """Returns the default downloads path for linux or windows"""
    if os.name == 'nt':
        import winreg
        sub_key = r'SOFTWAREMicrosoftWindowsCurrentVersionExplorerShell 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')
  • El GUID se puede obtener de Microsoft’s KNOWNFOLDERID documentos
  • Esto se puede ampliar para trabajar de forma más genérica en otros directorios.

La ubicación correcta de las carpetas de Windows es algo así como una tarea en Python. De acuerdo con las respuestas que cubren las tecnologías de desarrollo de Microsoft, como esta, deben obtenerse utilizando la API de carpetas conocidas de Vista. Esta API no está incluida en la biblioteca estándar de Python (aunque hay un problema desde 2008 que la solicita), pero se puede usar el módulo ctypes para acceder a ella de todos modos.

Adaptar la respuesta anterior para usar la identificación de la carpeta para las descargas que se muestra aquí y combinarla con su código Unix existente debería dar como resultado un código que se ve así:

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 módulo más completo para recuperar carpetas conocidas de Python está disponible en github.

from pathlib import Path
downloads_path = str(Path.home() / "Downloads")

valoraciones y reseñas

Finalizando este artículo puedes encontrar las explicaciones de otros creadores, tú asimismo tienes la opción de mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *