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