2016-03-07 3 views
7

मुझे पहले से ही this question मिला है जो उपयोगकर्ता की होम निर्देशिका प्राप्त करने के लिए os.path.expanduser(path) का उपयोग करने का सुझाव देता है।पायथन - उपयोगकर्ता के "डाउनलोड" फ़ोल्डर को ढूंढना

मैं इसे "डाउनलोड" फ़ोल्डर के साथ प्राप्त करना चाहता हूं। मुझे पता है कि this is possible in C#, फिर भी मैं पाइथन के लिए नया हूं और यह नहीं जानता कि यह यहां भी संभव है, बेहतर प्लेटफ़ॉर्म-स्वतंत्र (विंडोज़, उबंटू)।

मुझे पता है कि मैं बस download_folder = os.path.expanduser("~")+"/Downloads/" कर सकता हूं, फिर भी (at least in Windows) it is possible to change the Default download folder

+2

पर्याप्त ctypes-foo के साथ आप [इस उत्तर में विंडोज-विशिष्ट कोड] (http://stackoverflow.com/a/7672816/1600898) को पाइथन (अनुकूलित कर सकते हैं) के साथ गैर-विंडोज प्लेटफ़ॉर्म पर 'os.expanduser (...)' पर फ़ॉलबैक)। [यहां] (http://stackoverflow.com/a/29888752/1600898) एक उदाहरण है। नोट, हालांकि, एक "डाउनलोड" निर्देशिका एक मंच-स्वतंत्र अवधारणा नहीं है। लिनक्स सिस्टम का सामना करना संभव है, जिसमें एक नहीं है, इसलिए यह सुनिश्चित करना सुनिश्चित करें कि यह अस्तित्व में नहीं है। – user4815162342

+0

@ user4815162342: ठीक है, 'ए "डाउनलोड" निर्देशिका के साथ सलाह के लिए धन्यवाद एक मंच-स्वतंत्र अवधारणा नहीं है। –

उत्तर

5

विंडोज फ़ोल्डरों का सही ढंग से पता लगाने के लिए कुछ हद तक पायथन में एक कोर है। माइक्रोसॉफ्ट डेवलपमेंट टेक्नोलॉजीज जैसे this one को कवर करने वाले उत्तरों के मुताबिक, उन्हें Vista Known Folder API का उपयोग करके प्राप्त किया जाना चाहिए। यह एपीआई पायथन मानक लाइब्रेरी द्वारा लपेटा नहीं गया है (हालांकि an issue from 2008 अनुरोध कर रहा है), लेकिन कोई भी इसे एक्सेस करने के लिए ctypes मॉड्यूल का उपयोग कर सकता है।

ऊपर जवाब अनुकूल डाउनलोड shown here के लिए फ़ोल्डर आईडी का उपयोग करने के लिए और अपने मौजूदा यूनिक्स कोड के साथ संयोजित कोड है कि इस तरह दिखता है में परिणाम चाहिए:

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

अजगर से ज्ञात फ़ोल्डरों वापस लाने के लिए एक और पूरी मॉड्यूल available on github है।

+0

विस्तृत जांच और इस मुद्दे के लिंक के लिए धन्यवाद। –

+1

@ मार्कसवेनिंगर आप 'SHGetKnownFolderPath' के लिए [यह और अधिक संपूर्ण रैपर] (https://gist.github.com/mkropat/7550097) पर भी एक नज़र डालना चाहते हैं। – user4815162342

+0

धन्यवाद! मैं इस पर ध्यान दूँगा। 'get_download_folder()' वर्तमान में निम्न त्रुटि से क्रैश हो जाता है। 'फ़ाइल"। \ Downloadfolders.py ", लाइन 34, _get_known_folder_path में यदि SHGetKnownFolderPath (ctypes.byref (guid), 0, 0, ctypes.byref (pathptr)): ctypes.ArgumentError: तर्क 4: : c_wchar_p' –

2

यह काफी सरल समाधान (this reddit पद से विस्तार) मेरे लिए काम किया

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') 
  • यह और अधिक सामान्य रूप से अन्य निर्देशिकाओं
  • काम करने के लिए विस्तारित किया जा सकता GUID माइक्रोसॉफ्ट के KNOWNFOLDERID docs
  • से प्राप्त किया जा सकता
संबंधित मुद्दे