Работа с многоязычными каталогами (Python) - PullRequest
1 голос
/ 20 июня 2010

Я пытаюсь открыть файл, и я только что понял, что у py проблемы с моим именем пользователя (на русском). Любые предложения о том, как правильно декодировать / кодировать это, чтобы сделать праздным счастливым?

Я использую py 2.6.5

xmlfile = open(u"D:\\Users\\Эрик\\Downloads\\temp.xml", "r")

Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    xmlfile = open(str(u"D:\\Users\\Эрик\\Downloads\\temp.xml"), "r")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-12: ordinal not in range(128)

os.sys.getfilesystemencoding () 'MBCS'

xmlfile = open (u "D: \ Users \ Эрик \ Downloads \ temp.xml" .encode ("mbcs"), "r")

Traceback (последний вызов был последним): Файл "", строка 1, в xmlfile = open (u "D: \ Users \ Эрик \ Downloads \ temp.xml" .encode ("mbcs"), "r") Ошибка ввода-вывода: [ошибка 22], недопустимый режим ('r') или имя файла: 'D: \ Users \ Y? Ee \ Downloads \ temp.xml'

Ответы [ 2 ]

0 голосов
/ 21 июня 2010

Первая проблема:

xmlfile = open(u"D:\\Users\\Эрик\\Downloads\\temp.xml", "r")
### The above line should be OK, provided that you have the correct coding line
### For example # coding: cp1251

Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    xmlfile = open(str(u"D:\\Users\\Эрик\\Downloads\\temp.xml"), "r")
### HOWEVER the above traceback line shows you actually using str()
### which is DIRECTLY causing the error because it is attempting
### to decode your filename using the default ASCII codec -- DON'T DO THAT.
### Please copy/paste; don't type from memory.
UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-12: ordinal not in range(128)

Вторая проблема:

os.sys.getfilesystemencoding() производит 'mbcs'

xmlfile = open(u"D:\Users\Эрик\Downloads\temp.xml".encode("mbcs"), "r")
### (a) \t is interpreted as a TAB character, hence the file name is invalid.
### (b) encoding with mbcs seems not to be useful; it messes up your name ("Y?ee").

Traceback (most recent call last):
File "", line 1, in xmlfile = open(u"D:\Users\Эрик\Downloads\temp.xml".encode("mbcs"), "r")
IOError: [Errno 22] invalid mode ('r') or filename: 'D:\Users\Y?ee\Downloads\temp.xml'

Общие рекомендации по жесткому кодированию имен файлов в Windows , в порядке убывания предпочтений:

(1) Не
(2) Используйте /, например. "c:/temp.xml"
(3) Используйте необработанные строки с обратной косой чертой r"c:\temp.xml"
(4) Используйте двойную обратную косую черту "c:\\temp.xml"

0 голосов
/ 20 июня 2010

Первая проблема заключается в том, что анализатор пытается интерпретировать обратные слеши в строках, если вы не используете префикс r"raw quote".В версии 2.6.5 вам не нужно специально обрабатывать строку Unicode, но вам может потребоваться объявление кодировки файла в исходном коде, например:

# -*- coding: utf-8 -*-

, как определено в PEP 263 .Вот пример того, как он работает в интерактивном режиме:

$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2
>>> f = r"D:\Users\Эрик\Downloads\temp.xml"
>>> f
'D:\\Users\\\xd0\xad\xd1\x80\xd0\xb8\xd0\xba\\Downloads\\temp.xml'
>>> x = open(f, 'w')
>>> x.close()
>>> 
$ ls D*
D:\Users\Эрик\Downloads\temp.xml

Да, это в Unix-системе, поэтому \ не имеет смысла, и моя кодировка терминала - utf-8, но она работает.Возможно, вам придется дать подсказку кодирования синтаксическому анализатору при чтении файла.

...