2016-03-07 14 views
7

Ich habe bereits this question gefunden, das die Verwendung os.path.expanduser(path) vorschlägt, um das Home-Verzeichnis des Benutzers zu erhalten.python - Suchen des Ordners "Downloads" des Benutzers

Ich möchte das gleiche mit dem Ordner "Downloads" erreichen. Ich weiß, dass this is possible in C#, aber ich bin neu in Python und weiß nicht, ob dies auch hier möglich ist, vorzugsweise plattformunabhängig (Windows, Ubuntu).

Ich weiß, dass ich nur download_folder = os.path.expanduser("~")+"/Downloads/" tun konnte, noch (at least in Windows) it is possible to change the Default download folder.

+2

Mit ausreichend ctypes-foo könnten Sie [den Windows-spezifischen Code in dieser Antwort] (http://stackoverflow.com/a/7672816/1600898) an Python (mit ein Fallback auf 'os.expanduser (...)' auf Nicht-Windows-Plattformen). [Hier] (http://stackoverflow.com/a/29888752/1600898) ist ein Beispiel. Beachten Sie jedoch, dass ein "Downloads" -Verzeichnis kein plattformunabhängiges Konzept ist. Es ist durchaus möglich, auf Linux-Systeme zu stoßen, die nicht über ein solches System verfügen. Stellen Sie also sicher, dass Sie es erstellen, wenn es nicht existiert. – user4815162342

+0

@ user4815162342: Okay, danke für den Hinweis mit einem "Downloads" Verzeichnis ist kein plattformunabhängiges Konzept.'! –

Antwort

5

Das korrekte Auffinden von Windows-Ordnern ist in Python etwas mühsam. Laut Antworten auf Microsoft-Entwicklungstechnologien, wie this one, sollten sie mit dem Vista Known Folder API erhalten werden. Diese API wird nicht von der Python-Standardbibliothek umschlossen (obwohl es an issue from 2008 anfordert), aber man kann das ctypes-Modul verwenden, um trotzdem darauf zuzugreifen.

die obige Antwort Anpassung den Ordner-ID für Downloads shown here und kombiniert es mit Ihrem vorhandenen Unix-Code zu verwenden, sollte im Code führen, der wie folgt aussieht:

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

Ein komplettes Modul für das Abrufen von bekannten Ordnern von Python ist available on github.

+0

Danke für die detaillierte Untersuchung und den Link zum Thema. –

+1

@MarkusWeninger Sie können auch einen Blick auf [diesen vollständigeren Wrapper] (https://gist.github.com/mkgrop/7550097) für 'SHGetKnownFolderPath' werfen. – user4815162342

+0

Danke! Ich werde es mir ansehen. 'get_download_folder()' stürzt derzeit mit dem folgenden Fehler ab. 'File". \ Downloadfolders.py ", Zeile 34, in _get_known_folder_path wenn SHGetKnownFolderPath (ctypes.byref (guid), 0, 0, ctypes.byref (pathptr)): ctypes.ArgumentError: Argument 4: : erwartete LP_c_char_p-Instanz anstelle von Zeiger auf c_wchar_p' –

2

Diese recht einfache Lösung (von this reddit Post erweitert) arbeitete für mich

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') 
  • Die GUID kann von der Microsoft-KNOWNFOLDERID docs
  • Dieses erweitert werden kann allgemeiner andere Verzeichnisse erhalten werden
  • arbeiten
Verwandte Themen