Leyendo lineas de archivo de texto en python (windows)

Estoy trabajando en una simple rutina de importación que traduce un archivo de texto a un formato de archivo json para nuestro sistema en Python.

 importar json

 # Abrir archivo de texto para leer
 txtFile = abierto ('Boating.Make.txt', 'r')

 # Crear lista de selección obj
 picklistObj = dict ()
 picklistObj ['name'] = 'Boating.Make'
 picklistObj ['items'] = list ()

 i = 0
 # Iterar a través de cada marca en el archivo de texto
 para línea en txtFile:
     picklistItemObj = dict ()
     picklistItemObj ['valor'] = str (i)
     picklistItemObj ['text'] = line.strip ()
     picklistItemObj ['selectable'] = True
     picklistObj ['items']. append (picklistItemObj)
     i = i + 1
 txtFile.close ()

 picklistJson = json.dumps (picklistObj, indent = 4)
 imprimir lista de reproducciónJson

 picklistFile = abierto ('Boating.Make.json', 'w')
 picklistFile.write (picklistJson)
 picklistFile.close ()

Mi pregunta es, ¿por qué necesito la “tira”? Pensé que se suponía que Python sabía mágicamente la constante de nueva línea para cualquier entorno en el que estuviera actualmente. ¿Me estoy perdiendo algo?

Debo aclarar que el archivo de texto del que estoy leyendo es un archivo ASCII que contiene líneas de texto separadas por ‘\ r \ n’.

Python mantiene los nuevos caracteres de línea mientras enumera las líneas. Por ejemplo, al enumerar un archivo de texto como

foo bar 

obtienes dos cadenas: "foo\n" y "bar\n" . Si no desea que los caracteres de la nueva línea del terminal, llame a la strip() .

Por cierto, no soy un fan de este comportamiento.

Ver esto

Python generalmente se construye con soporte de nueva línea universal; el suministro de ‘U’ abre el archivo como un archivo de texto, pero las líneas pueden terminar con cualquiera de los siguientes: la convención de final de línea de Unix ‘\ n’, la convención de Macintosh ‘\ r’ o la convención de Windows ‘\ r \ n ‘

Necesita la tira () porque “for line in file:” mantiene los terminadores de línea en las líneas. No se indica explícitamente en los documentos (al menos en el documento 2.71 que estoy viendo). Pero funciona de una manera similar a file.readline (), que establece explícitamente que conserva la nueva línea.

Pruebe lo siguiente en un intérprete de Python para ver qué hace el idioma:

 open('test1.txt', 'wb').write(b'Hello\nWorld!') open('test2.txt', 'wb').write(b'Hello\r\nWorld!') print(list(open('test1.txt'))) # Shows ['Hello\n', 'World!'] print(list(open('test2.txt'))) # Shows ['Hello\n', 'World!'] 

Python reconoce las nuevas líneas correctas. En lugar de usar strip en sus cadenas, es posible que desee escribir myString.replace('\n', '') lugar. Compruebe la documentación:

 >>> help(str.strip) Help on method_descriptor: strip(...) S.strip([chars]) -> str Return a copy of the string S with leading and trailing whitespace removed. If chars is given and not None, remove characters in chars instead. >>> help(str.replace) Help on method_descriptor: replace(...) S.replace(old, new[, count]) -> str Return a copy of S with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.