Согласно документации для open()
, вы должны добавить U
в режим:
open('textbase.txt', 'Ur')
Это разрешает " универсальные переводы строк ", что нормализует их до \n
в строках, которые оно вам дает.
Тем не менее, правильное решение - декодировать UTF-16BE в объекты Unicode сначала , прежде чем переводить переводы строки. В противном случае, случайный 0x0d
байт может быть ошибочно превращен в 0x0a
, в результате чего
UnicodeDecodeError: кодек «utf16» не может декодировать байт 0x0a в позиции 12: усеченные данные.
Модуль Python codecs
предоставляет функцию open
, которая может декодировать Unicode и обрабатывать символы новой строки одновременно:
import codecs
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'):
...
Если файл имеет метку порядка байтов (BOM), и вы указываете 'utf-16'
, тогда он обнаруживает порядковый номер и скрывает BOM для вас. Если этого не произойдет (поскольку спецификация является необязательной), то этот декодер просто продолжит работу и будет использовать порядковый номер вашей системы, что, вероятно, не будет хорошо.
Указание порядка байтов самостоятельно (с помощью 'utf-16be'
) не скроет спецификацию, поэтому вы можете использовать этот хак:
import codecs
firstline = True
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'):
if firstline:
firstline = False
line = line.lstrip(u'\ufeff')
См. Также: Python Unicode HOWTO