Python cree que un archivo de texto de 3000 líneas tiene una línea de largo?

Tengo un archivo de texto muy largo que estoy tratando de procesar usando Python.

Sin embargo, el siguiente código:

for line in open('textbase.txt', 'r'): print 'hello world' 

produce solo la siguiente salida:

 hello world 

Es como si Python pensara que el archivo solo tiene una línea, aunque tiene muchos miles de líneas cuando se ve en un editor de texto. Al examinarlo en la línea de comando usando el comando file, se obtiene:

 $ file textbase.txt textbase.txt: Big-endian UTF-16 Unicode English text, with CR line terminators 

¿Hay algo mal? ¿Necesito cambiar los terminadores de línea?

De acuerdo con la documentación de open() , debe agregar una U al modo:

 open('textbase.txt', 'Ur') 

Esto habilita las ” nuevas líneas universales “, que las normalizan a \n en las cadenas que le proporciona.

Sin embargo, lo correcto es descodificar primero el UTF-16BE en objetos Unicode, antes de traducir las nuevas líneas. De lo contrario, un byte de 0x0d podría convertirse erróneamente en un 0x0a , lo que resultaría en

UnicodeDecodeError: el codec ‘utf16’ no puede decodificar el byte 0x0a en la posición 12: datos truncados.

El módulo de codecs de Python proporciona una función open que puede decodificar Unicode y manejar nuevas líneas al mismo tiempo:

 import codecs for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'): ... 

Si el archivo tiene una marca de orden de bytes (BOM) y usted especifica 'utf-16' , entonces detecta la endianidad y oculta la lista de materiales para usted. Si no lo hace (ya que la lista de materiales es opcional), ese decodificador simplemente seguirá adelante y utilizará la endianidad de su sistema, lo que probablemente no será bueno.

Especificar la endianness usted mismo (con 'utf-16be' ) no ocultará la lista de materiales, por lo que es posible que desee utilizar este truco:

 import codecs firstline = True for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'): if firstline: firstline = False line = line.lstrip(u'\ufeff') 

Ver también: Cómo de Python Unicode.

Probablemente encontrará que es el “con terminadores de línea CR” que regala el juego. Si está trabajando en una plataforma que utiliza nuevas líneas como terminadores de línea, verá su archivo como una gran línea de honor.

Cambie su archivo de entrada para que use los terminadores de línea correctos. Su editor es probablemente más indulgente que su implementación de Python.

Los finales de línea CR son una cosa de Mac, que yo sepa, y puede usar el modificador de modo U para open la detección automática basándose en el primer terminador de línea encontrado.

Parece que su archivo tiene líneas terminadas solo por CR, y Python probablemente espera LF o CRLF. Intenta usar la ‘nueva línea universal’:

 for line in open('textbase.txt', 'rU'): print 'hello world' 

http://docs.python.org/library/functions.html?highlight=open#open

open() devuelve un objeto de archivo. Necesitas usar:

 for line in open('textbase.txt', 'r').readlines(): print line