Использование Python, Как скопировать файлы в папку «временные интернет-файлы» в Windows - PullRequest
0 голосов
/ 19 мая 2010

Я использую этот код для рекурсивного поиска файлов в папке размером более 50000 байт.

def listall(parent):
    lis=[] 
    for root, dirs, files in os.walk(parent):
         for name in files:
             if os.path.getsize(os.path.join(root,name))>500000:                                
                   lis.append(os.path.join(root,name))
    return lis 

Это работает нормально. Но когда я использовал это в папке «временные интернет-файлы» в Windows, я получаю эту ошибку.

Traceback (most recent call last):
File "<pyshell#4>", line 1, 
in <module> listall(a) File "<pyshell#2>", 
line 5, in listall if os.path.getsize(os.path.join(root,name))>500000: 
File "C:\Python26\lib\genericpath.py", line 49, in getsize return os.stat(filename).st_size WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: 'C:\\Documents and Settings\\khedarnatha\\Local Settings\\Temporary Internet Files\\Content.IE5\\EDS8C2V7\\??????+1[1].jpg' 

Я думаю, это потому, что в этой папке Windows дает имена со специальными символами ... Пожалуйста, помогите разобраться с этой проблемой.

1 Ответ

3 голосов
/ 19 мая 2010

Это потому, что в сохраненном файле '(что-то) +1 [1] .jpg' есть не-ASCII-символы в имени, которые не вписываются в "системную кодовую страницу по умолчанию" (также вводящую в заблуждение как ANSI «).

Такие программы, как Python, в которых используются функции доступа к файлам стандартной библиотеки C (stdio), имеют большие проблемы с именами файлов Unicode. На других платформах они могут просто использовать UTF-8, и все будут довольны, но в Windows системная кодовая страница по умолчанию никогда не будет UTF-8, поэтому всегда будут символы, которые не могут быть представлены в данной кодировке. Они будут заменены ? или иногда другими похожими символами, а затем, когда вы попытаетесь прочитать файлы с искаженными именами, вы получите ошибки, подобные приведенным выше.

Какая кодовая страница вы получите, зависит от вашей локали: в случае установки Windows для Windows это будет cp1252 (аналогично ISO-8859-1, «Latin-1»), так что вам нужно будет использовать только символы .

К счастью, достаточно свежие версии Python (2.3+, согласно PEP277 ) также могут напрямую поддерживать имена файлов Unicode, используя собственные интерфейсы Win32 API вместо stdio. Если вы передадите строку Unicode в os.listdir(), Python будет использовать эти API-интерфейсы native-Unicode, и вы получите строки Unicode, которые будут содержать оригинальные символы в имени файла вместо искаженных. Поэтому, если вы позвоните listall с путем Unicode:

listall(ur'C:\Documents and Settings\khedarnatha\Local Settings\Temporary Internet Files')

Это должно Просто Работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...