Это потому, что в сохраненном файле '(что-то) +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')
Это должно Просто Работать.