Python os.stat и unicode имена файлов

В моем приложении Django пользователь загрузил файл с unicode символом на имя.

Когда я загружаю файлы, я звоню:

os.path.exists(media)

для тестирования этого, файл там. Это, в свою очередь, кажется, звонит

st = os.stat(path)

Который затем аварийно завершается с ошибкой:

UnicodeEncodeError: кодек 'ASCII' не может закодировать символ u '\xcf' в положении 92: порядковый не в диапазоне (128)

Что я могу сделать об этом? Существует ли опция к path.exists для обработки его?

Обновление: На самом деле все, что я должен был сделать, было, кодируют аргумент, существует, т.е.

os.path.exists(media.encode('utf-8')

Спасибо все, кто ответил.

16
задан interstar 21 January 2010 в 23:08
поделиться

2 ответа

Я предполагаю, что вы в Unix. Если нет, пожалуйста, не забудьте сказать, какую ОС вы находитесь.

Убедитесь, что ваш локаль установлен на UTF-8. Все современные системы Linux делают это по умолчанию, обычно, установив переменную среды Lang на «en_us.utf-8» или другой язык. Кроме того, убедитесь, что ваши имена файлов кодируются в UTF-8.

С помощью этого набора нет необходимости беспорядок с кодировками для доступа к файлам на любом языке, даже в Python 2.x.

[~/test] echo $LANG
en_US.UTF-8
[~/test] echo testing > 漢字
[~/test] python2.6
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.stat("漢字")
posix.stat_result(st_mode=33188, st_ino=548583333L, st_dev=2049L, st_nlink=1, st_uid=1000, st_gid=1000, st_size=8L, st_atime=1263634240, st_mtime=1263634230, st_ctime=1263634230)
>>> os.stat(u"漢字")
posix.stat_result(st_mode=33188, st_ino=548583333L, st_dev=2049L, st_nlink=1, st_uid=1000, st_gid=1000, st_size=8L, st_atime=1263634240, st_mtime=1263634230, st_ctime=1263634230)
>>> open("漢字").read()
'testing\n'
>>> open(u"漢字").read()
'testing\n'

Если это не работает, запустить «локаль»; Если значения «C» вместо EN_US.UTF-8, у вас может быть неправильно установлена ​​локаль.

Если вы находитесь в Windows, я думаю, что имена файлов Unicode всегда должны работать (по крайней мере, для модулей OS / POSIX), поскольку API файла Unicode в Windows поддерживается прозрачно.

8
ответ дан 30 November 2019 в 22:43
поделиться

Кодируйте кодировку файловой системы перед вызовом. См. модуль locale.

2
ответ дан 30 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: