Định vị chính xác các thư mục Windows có phần là một việc vặt trong Python. Theo câu trả lời bao gồm các công nghệ phát triển của Microsoft, chẳng hạn như this one, chúng phải được lấy bằng cách sử dụng Vista Known Folder API. API này không được bao bọc bởi thư viện chuẩn Python (mặc dù có an issue from 2008 yêu cầu nó), nhưng có thể sử dụng mô-đun ctypes để truy cập nó.
Thích ứng với câu trả lời trên để sử dụng id thư mục để tải shown here và kết hợp nó với mã Unix hiện tại của bạn nên kết quả trong mã mà trông như thế này:
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")
Một module hoàn chỉnh hơn để lấy các thư mục được biết đến từ Python là available on github.
Với đủ ctypes-foo bạn có thể điều chỉnh [mã dành riêng cho Windows trong câu trả lời này] (http://stackoverflow.com/a/7672816/1600898) thành Python (với một dự phòng cho 'os.expanduser (...)' trên các nền tảng không phải Windows). [Ở đây] (http://stackoverflow.com/a/29888752/1600898) là một ví dụ. Tuy nhiên, lưu ý rằng thư mục "Tải xuống" không phải là khái niệm độc lập nền tảng. Có thể gặp phải các hệ thống Linux không có, vì vậy hãy chắc chắn tạo ra nó nếu nó không tồn tại. – user4815162342
@ user4815162342: Ok, cảm ơn lời khuyên với thư mục 'a' Tải xuống 'không phải là khái niệm độc lập nền tảng.'! –