Unicode (UTF-8) чтение и запись в файлы в Python

Вам необходимо использовать свойства from и exact. Чтобы использовать оба свойства, такой Redirect должен быть дочерним по отношению к компоненту Switch (см. Документы здесь ):

 (
  
    
      
      
      
      
    
  
)}>

305
задан Peter Mortensen 4 January 2017 в 08:07
поделиться

6 ответов

В нотации

u'Capit\xe1n\n'

"\xe1" представляет всего один байт. "\x" говорит Вам, что "e1" находится в шестнадцатеричном. Когда Вы пишете

Capit\xc3\xa1n

в Ваш файл, у Вас есть "\xc3" в нем. Это - 4 байта, и в Вашем коде Вы читаете их всех. Вы видите это при отображении их:

>>> open('f2').read()
'Capit\\xc3\\xa1n\n'

Вы видите, что обратной косой черты оставляет обратная косая черта. Таким образом, у Вас есть четыре байта в Вашей строке: "\", "x", "c" и "3".

Редактирование:

, Поскольку другие указали в их ответах, необходимо просто ввести символы в редактора, и редактор должен затем обработать преобразование в UTF-8 и сохранить его.

, Если у Вас на самом деле есть строка в этом формате, можно использовать string_escape кодек для декодирования его в нормальную строку:

In [15]: print 'Capit\\xc3\\xa1n\n'.decode('string_escape')
Capitán

результатом является строка, которая кодируется в UTF-8, где символ с диакритикой представлен на два байта, которые были записаны \\xc3\\xa1 в исходной строке. Если Вы хотите иметь строку unicode, необходимо декодировать снова с UTF-8.

К Вашему редактированию: у Вас нет UTF-8 в Вашем файле. Чтобы на самом деле видеть, как это было бы похоже:

s = u'Capit\xe1n\n'
sutf8 = s.encode('UTF-8')
open('utf-8.out', 'w').write(sutf8)

Сравнивают содержание файла utf-8.out к содержанию файла, который Вы сохранили со своим редактором.

105
ответ дан 23 November 2019 в 01:19
поделиться

\x.. последовательность - что-то, что это характерно для Python. Это не универсальная escape-последовательность байта.

то, Как Вы на самом деле входите в UTF-8-encoded неASCII, зависит от Вашей ОС и/или Вашего редактора. Вот то, как Вы делаете это в Windows . Чтобы OS X вошел с акутом, можно просто поразить опцию + E , затем , и почти все текстовые редакторы в OS X поддерживают UTF-8.

4
ответ дан Peter Mortensen 23 November 2019 в 01:19
поделиться

Ну, Ваш любимый текстовый редактор не понимает, что \xc3\xa1, как предполагается, символьные литералы, но он интерпретирует их как текст. Вот почему Вы получаете двойные обратные косые черты в последней строке - это - теперь реальная обратная косая черта + xc3, и т.д. в Вашем файле.

, Если Вы хотите считать и записать закодированные файлы в Python, лучше всего используйте эти кодеки модуль.

текст Вставки между терминалом и приложениями является трудным, потому что Вы не знаете, какая программа интерпретирует Ваше текстовое использование который кодирование. Вы могли попробовать следующее:

>>> s = file("f1").read()
>>> print unicode(s, "Latin-1")
Capitán

Затем вставка эта строка в Вашего редактора и удостоверяется, что хранит его с помощью латинского 1. Под предположением, что буфер обмена не искажает строку, должно работать распространение в прямом и обратном направлениях.

5
ответ дан Peter Mortensen 23 November 2019 в 01:19
поделиться

Так, я нашел решение для того, что я ищу, который является:

print open('f2').read().decode('string-escape').decode("utf-8")

существуют некоторые необычные кодеки, которые полезны здесь. Это конкретное чтение позволяет взять представления UTF-8 из Python, скопировать их в ASCII-файл и сделать, чтобы они были считаны в в Unicode. При "строковом Escape" декодируют, наклонные черты не будут удвоены.

Это допускает вид распространения в прямом и обратном направлениях, которое я воображал.

18
ответ дан Peter Mortensen 23 November 2019 в 01:19
поделиться

Вы споткнулись общую проблему с кодировкой: Как я могу сказать, в котором кодирование файла?

Ответ: Вы не можете , если формат файла не предусматривает это. XML, например, начинается:

<?xml encoding="utf-8"?>

Этот заголовок был тщательно выбран так, чтобы он мог быть считан, неважно, кодирование. В Вашем случае нет такой подсказки, следовательно ни у Вашего редактора, ни Python нет идеи, что продолжается. Поэтому необходимо использовать codecs модуль и использование codecs.open(path,mode,encoding), который обеспечивает недостающий бит в Python.

Что касается Вашего редактора, необходимо проверить, предлагает ли это некоторый способ установить кодирование файла.

точка UTF-8 должна смочь закодировать 21-разрядные символы (Unicode) 8-разрядным потоком данных (потому что это - единственная вещь, которую все компьютеры в мире могут обработать). Но начиная с большей части OSs предшествуют эре Unicode, у них нет подходящих инструментов для присоединения информации о кодировании к файлам на жестком диске.

следующий выпуск является представлением в Python. Это объяснено отлично в эти комментарий heikogerlach. Необходимо понять, что консоль может только отобразить ASCII. Для отображения Unicode или чего-либо> = charcode 128, он должен использовать некоторые средства выхода. В Вашем редакторе Вы не должны вводить завершенную строку дисплея, но что означает строка (в этом случае, необходимо ввести умляут и сохранить файл).

Тем не менее можно использовать оценку функции Python () для превращения завершенной строки в строку:

>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1

, Как Вы видите, строка "\xc3" была превращена в отдельный символ. Это - теперь 8-разрядная строка, закодированный UTF-8. Получить Unicode:

>>> x.decode('utf-8')
u'Capit\xe1n\n'

Gregg Lind спросил: Я думаю, что существуют некоторые части, отсутствующие здесь: файл f2 содержит: шестнадцатеричное число:

0000000: 4361 7069 745c 7863 335c 7861 316e  Capit\xc3\xa1n

codecs.open('f2','rb', 'utf-8'), например, читает их всех в, отдельные (ожидаемые) символы Являются там каким-либо способом записать в файл в ASCII, который работал бы?

Ответ: Это зависит от того, что Вы имеете в виду. ASCII не может представить символы> 127. Таким образом, Вам нужен некоторый способ сказать, что "следующие несколько символов означают что-то специальное", которое является тем, что делает последовательность "\x". Это говорит: следующие два символа являются кодом отдельного символа. "\u" делает то же использование четырех символов для кодирования Unicode до 0xFFFF (65535).

, Таким образом, Вы не можете непосредственно записать Unicode в ASCII (потому что ASCII просто не содержит те же символы). Можно записать это, поскольку строка выходит (как в f2); в этом случае файл может быть представлен как ASCII. Или можно записать это как UTF-8, в этом случае, Вам нужен 8-разрядный безопасный поток.

Ваше решение с помощью decode('string-escape') действительно работает, но необходимо знать, сколько памяти Вы используете: Три раза объем использования codecs.open().

Помнят, что файл является просто последовательностью байтов с 8 битами. Ни биты, ни байты не имеют значение. Это - Вы, кто говорит "65, означает 'A'". С тех пор \xc3\xa1 должен стать "Г", но компьютер не имеет никаких средств знать, необходимо сказать его путем определения кодирования, которое использовалось при записи файла.

6
ответ дан Community 23 November 2019 в 01:19
поделиться

Вместо того, чтобы возиться с методами кодирования и декодирования Мне проще указать кодировку при открытии файла. Модуль io (добавлен в Python 2.6) предоставляет функцию io.open , которая имеет параметр кодирования.

Используйте метод open из io Модуль .

>>>import io
>>>f = io.open("test", mode="r", encoding="utf-8")

Затем после вызова функции read () функции f, возвращается закодированный объект Unicode.

>>>f.read()
u'Capit\xe1l\n\n'

Обратите внимание, что в Python 3 функция io.open является псевдонимом для встроенной функции open . Встроенная функция open поддерживает аргумент кодировки только в Python 3, но не в Python 2.

Изменить: ранее в этом ответе рекомендовался модуль кодеков . Модуль кодеков может вызвать проблемы при смешивании read () и readline () , поэтому в этом ответе вместо этого рекомендуется модуль io .

Используйте метод open из модуля кодеков.

>>>import codecs
>>>f = codecs.open("test", "r", "utf-8")

Затем после вызова функции f read () возвращается закодированный объект Unicode.

>>>f.read()
u'Capit\xe1l\n\n'

Если вы знаете кодировку файла, использование пакета кодеков будет намного меньше сбивает с толку.

См. http://docs.python.org/library/codecs.html#codecs. open

678
ответ дан 23 November 2019 в 01:19
поделиться
Другие вопросы по тегам:

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