web-dev-qa-db-ja.com

python-ユーザーの「ダウンロード」フォルダを見つける

私はすでに この質問 を見つけました。これはos.path.expanduser(path)を使用してユーザーのホームディレクトリを取得することを提案しています。

「ダウンロード」フォルダでも同じようにしたいのですが。私は これはC#で可能です を知っていますが、Pythonは初めてですが、これも可能かどうかはわかりません。プラットフォームに依存しない(Windows 、Ubuntu)。

私はdownload_folder = os.path.expanduser("~")+"/Downloads/"を実行できることを知っていますが、それでも (少なくともWindowsでは)デフォルトのダウンロードフォルダを変更することは可能です

14
Markus Weninger

Pythonでは、Windowsフォルダを正しく配置するのが面倒です。 this one などのMicrosoft開発テクノロジーに関する回答によれば、それらはVista Known Folder API を使用して取得する必要があります。このAPIは、Python標準ライブラリによってラップされていません(ただし 2008年からの問題 要求があります))が、ctypesモジュールを使用してそれにアクセスできます。

上記の回答をダウンロード用のフォルダーIDを使用するように変更 ここに表示 を既存のUnixコードと組み合わせると、次のようなコードになります。

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

Python=から既知のフォルダを取得するためのより完全なモジュールは githubで利用可能 です。

8
user4815162342

このかなり単純なソリューション( this reddit postから拡張)は私のために働きました

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はMicrosoftの KNOWNFOLDERID docs から取得できます
  • これを拡張して、他のディレクトリをより一般的に機能させることができます
11

Python3 + MacまたはLinuxの場合

from pathlib import Path
path_to_download_folder = str(os.path.join(Path.home(), "Downloads"))
2
Jeff WR
import os

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

0
Joao Vitor Deon