Python считает, что текстовый файл с 3000 строк длинный?
У меня очень длинный текстовый файл, который я пытаюсь обрабатывать с помощью Python.
Однако следующий код:
for line in open('textbase.txt', 'r'):
print 'hello world'
выводит только следующий результат:
hello world
Как будто Python думает, что файл имеет длину только одну строку, хотя он длиннее многих тысяч строк, если смотреть в текстовом редакторе. Изучение его в командной строке с помощью команды file дает:
$ file textbase.txt
textbase.txt: Big-endian UTF-16 Unicode English text, with CR line terminators
Что-то не так? Нужно ли менять терминаторы строк?
Ответы
Ответ 1
Согласно документации для open()
, вы должны добавить U
в режим:
open('textbase.txt', 'Ur')
Это позволяет " универсальные новые строки", который нормализует их до \n
в строках, которые он вам дает.
Однако правильная вещь - сначала декодировать UTF-16BE в объекты Unicode, прежде чем переводить новые строки. В противном случае шанс 0x0d
байта может ошибочно превратиться в 0x0a
, в результате чего
UnicodeDecodeError: кодек 'utf16' не может декодировать байт 0x0a в позиции 12: усеченные данные.
Python codecs
модуль предоставляет функцию open
, которая может декодировать Юникод и обрабатывать новые строки в одно и то же время:
import codecs
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'):
...
Если у файла есть знак порядка байтов (BOM), и вы указываете 'utf-16'
, тогда он обнаруживает сущность и скрывает спецификацию для вас. Если это не так (поскольку спецификация не является обязательной), то этот декодер будет просто идти вперед и использовать вашу системную сущность, что, вероятно, не будет хорошим.
Задание конечности самостоятельно (с помощью '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
Ответ 2
Вероятно, вы найдете его с терминаторами линии CR, которые отдают игру. Если вы работаете на платформе, которая использует новые строки в качестве терминаторов строк, она увидит ваш файл как одну большую строку "honkin".
Измените свой входной файл так, чтобы он использовал правильные терминаторы строк. Ваш редактор, вероятно, более прощает, чем ваша реализация Python.
Конечные строки CR - это предмет Mac, насколько я знаю, и вы можете использовать модификатор режима U
для open
для автоматического обнаружения на основе найденного первого ограничителя строки.
Ответ 3
похоже, что ваш файл имеет строки, завершенные только CR, а Python, вероятно, ожидает LF или CRLF. Попробуйте использовать "универсальную новую строку":
for line in open('textbase.txt', 'rU'):
print 'hello world'
http://docs.python.org/library/functions.html?highlight=open#open
Ответ 4
open()
возвращает объект файла. Вам необходимо использовать:
for line in open('textbase.txt', 'r').readlines():
print line