De acuerdo con la documentation for open()
, se debe añadir un U
al modo:
open('textbase.txt', 'Ur')
Esto permite "universal newlines", lo que les normaliza a \n
en las cadenas que te da .
Sin embargo, lo correcto es decodificar el UTF-16BE en objetos Unicode primero, antes de traducir las nuevas líneas. De lo contrario, un byte oportunidad 0x0d
podría conseguir erróneamente convertido en un 0x0a
, lo que resulta en
UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 12: truncated data.
de codecs
module suministra una función open
que puede decodificar Unicode y manejar los saltos de línea, al mismo tiempo Python:
import codecs
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'):
...
Si el el archivo tiene una marca de orden de bytes (BOM) y usted especifica 'utf-16'
, luego detecta el endianness y oculta la lista de materiales por usted. Si no lo hace (dado que la lista de materiales es opcional), entonces ese decodificador simplemente continuará y usará la endianidad de su sistema, lo que probablemente no sea bueno.
Especificación del orden de bits a sí 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: Python Unicode HOWTO
¿Qué sistema operativo estás? –
@OP, ¿de dónde viene textbase.txt? ventanas? intente hacer un dos2unix en el archivo y vea que resuelve el problema – ghostdog74
@jldupont: Creo que AP257 esperaba imprimir "hello world" para cada línea del archivo de entrada, tal como dice el código :-) – paxdiablo