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.