2012-07-01 11 views
12

Mi archivo es "xml.txt" con el siguiente contenido:para leer la línea del archivo en Python sin conseguir " n" añadido al final

books.xml 
news.xml 
mix.xml 

si uso readline() Función anexa "\ n "al nombre de todos los archivos, que es un error porque quiero abrir los archivos contenidos en xml.txt. Escribí esto:

fo = open("xml.tx","r") 
for i in range(count.__len__()): #here count is one of may arrays that i'm using 
    file = fo.readline() 
    find_root(file) # here find_root is my own created function not displayed here 

error encontrado en la ejecución de este código:

IOError: [Errno 2] No existe el fichero o directorio: 'books.xml \ n'

+3

No utilice 'recuento .__ len __()', 'pero len (cuenta)'! –

+0

Aunque la pregunta se refiere específicamente al carácter ''\ n'', hay una cuestión más general de leer una línea sin el final de línea, cualquiera que sea el archivo. Casi todas las respuestas no abordan esto. (Parece que lo de Daniel F.) – brianmearns

Respuesta

32

Para extraer sólo la nueva línea al final:

line = line.rstrip('\n') 

La razón readline mantiene el carácter de nueva línea es para que pueda distinguir entre una línea vacía (tiene el salto de línea) y el final del archivo (cadena vacía).

+0

tHanks, funcionó :) –

+0

simple y directo al grano. Excelente solucion – Jiraheta

6

podría utilizar el .rstrip() método de objetos de cadena para eliminar una versión con espacios en blanco al final (incluidas las líneas nuevas).

Ej:

find_root(file.rstrip()) 
+0

¿me puede decir la sintaxis? Me refiero a cómo y dónde debo agregar esto? –

+0

Ver ejemplo editado. – Amber

+0

gracias :) funcionó –

1

Es mejor estilo de utilizar un gestor de contexto para el archivo y len() en lugar de llamar .__len__()

with open("xml.tx","r") as fo: 
    for i in range(len(count)): #here count is one of may arrays that i'm using 
     file = next(fo).rstrip("\n") 
     find_root(file) # here find_root is my own created function not displayed here 
+1

Olvidó mencionar que un buen estilo de Python también incluye el hecho de no ocultar integrables con sus propios nombres, como 'archivo' ... – martineau

+0

@martineau, sí, dejé que se deslizara ya que está en desuso –

1

Para quitar el carácter de nueva línea lado a otro al final también se podría utilizar algo como esto:

for line in file: 
    print line[:-1] 
1

Lo sincronicé solo por curiosidad. A continuación se muestran los resultados para un archivo de gran tamaño.

tldr; Lectura de archivo, a continuación, dividir parece ser el enfoque más rápido en un archivo grande.

with open(FILENAME, "r") as file: 
    lines = file.read().split("\n") 

Sin embargo, si necesita colocar a través de las líneas de todos modos, entonces probablemente quiera:

with open(FILENAME, "r") as file: 
    for line in file: 
     line = line.rstrip("\n") 

Python 3.4.2

import timeit 


FILENAME = "mylargefile.csv" 
DELIMITER = "\n" 


def splitlines_read(): 
    """Read the file then split the lines from the splitlines builtin method. 

    Returns: 
     lines (list): List of file lines. 
    """ 
    with open(FILENAME, "r") as file: 
     lines = file.read().splitlines() 
    return lines 
# end splitlines_read 

def split_read(): 
    """Read the file then split the lines. 

    This method will return empty strings for blank lines (Same as the other methods). 
    This method may also have an extra additional element as an empty string (compared to 
    splitlines_read). 

    Returns: 
     lines (list): List of file lines. 
    """ 
    with open(FILENAME, "r") as file: 
     lines = file.read().split(DELIMITER) 
    return lines 
# end split_read 

def strip_read(): 
    """Loop through the file and create a new list of lines and removes any "\n" by rstrip 

    Returns: 
     lines (list): List of file lines. 
    """ 
    with open(FILENAME, "r") as file: 
     lines = [line.rstrip(DELIMITER) for line in file] 
    return lines 
# end strip_readline 

def strip_readlines(): 
    """Loop through the file's read lines and create a new list of lines and removes any "\n" by 
    rstrip. ... will probably be slower than the strip_read, but might as well test everything. 

    Returns: 
     lines (list): List of file lines. 
    """ 
    with open(FILENAME, "r") as file: 
     lines = [line.rstrip(DELIMITER) for line in file.readlines()] 
    return lines 
# end strip_readline 

def compare_times(): 
    run = 100 
    splitlines_t = timeit.timeit(splitlines_read, number=run) 
    print("Splitlines Read:", splitlines_t) 

    split_t = timeit.timeit(split_read, number=run) 
    print("Split Read:", split_t) 

    strip_t = timeit.timeit(strip_read, number=run) 
    print("Strip Read:", strip_t) 

    striplines_t = timeit.timeit(strip_readlines, number=run) 
    print("Strip Readlines:", striplines_t) 
# end compare_times 

def compare_values(): 
    """Compare the values of the file. 

    Note: split_read fails, because has an extra empty string in the list of lines. That's the only 
    reason why it fails. 
    """ 
    splr = splitlines_read() 
    sprl = split_read() 
    strr = strip_read() 
    strl = strip_readlines() 

    print("splitlines_read") 
    print(repr(splr[:10])) 

    print("split_read", splr == sprl) 
    print(repr(sprl[:10])) 

    print("strip_read", splr == strr) 
    print(repr(strr[:10])) 

    print("strip_readline", splr == strl) 
    print(repr(strl[:10])) 
# end compare_values 

if __name__ == "__main__": 
    compare_values() 
    compare_times() 

Resultados:

run = 1000 
Splitlines Read: 201.02846901328783 
Split Read: 137.51448011841822 
Strip Read: 156.18040391519133 
Strip Readline: 172.12281272950372 

run = 100 
Splitlines Read: 19.956802833188124 
Split Read: 13.657361738959867 
Strip Read: 15.731161020969516 
Strip Readlines: 17.434831199281092 

run = 100 
Splitlines Read: 20.01516321280158 
Split Read: 13.786344555543899 
Strip Read: 16.02410587620824 
Strip Readlines: 17.09326775703279 

Lectura de archivo luego dividir parece ser el ayuno st enfoque en un archivo grande.

Nota: read then split ("\ n") tendrá una cadena adicional vacía al final de la lista.

Nota: lea luego las líneas divisorias() comprueba más que solo "\ n" posiblemente "\ r \ n".

0
# mode : 'r', 'w', 'a' 
f = open("ur_filename", "mode") 
for t in f: 
    if(t): 
     fn.write(t.rstrip("\n")) 

"Si" condición comprobará si la línea tiene cuerda o no, en caso afirmativo siguiente línea se tira de la "\ n" al final y escribir en un archivo. Código probado. ;)

1

Un caso de uso con la respuesta de @Lars Wirzenius:

with open("list.txt", "r") as myfile: 
    for lines in myfile: 
     lines = lines.rstrip('\n') # the trick 
     try: 
      with open(lines) as myFile: 
       print "ok" 
     except IOError as e: 
      print "files does not exist" 
Cuestiones relacionadas