2012-07-01 24 views
12

Il mio file è "xml.txt" con i seguenti contenuti:per leggere riga dal file in python senza ottenere " n" aggiunto alla fine

books.xml 
news.xml 
mix.xml 

se uso readline() la funzione che aggiunge "\ n "al nome di tutti i file che è un errore perché voglio aprire i file contenuti all'interno di xml.txt. Ho scritto questo:

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 

errore riscontrato su esecuzione di questo codice:

IOError: [Errno 2] Nessun file o directory: 'books.xml \ n'

+3

Non usare 'count .__ len __()', ma 'len (contare)'! –

+0

Sebbene la domanda si riferisca specificamente al carattere ''\ n'', c'è un problema più generale di leggere una riga senza la fine della linea, qualunque essa sia per il file. Quasi tutte le risposte non affrontano questo. (Sembra che Daniel F.). – brianmearns

risposta

32

Per rimuovere solo la nuova riga alla fine:

line = line.rstrip('\n') 

Il motivo readline mantiene il carattere di nuova riga viene in modo da poter distinguere tra una riga vuota (ha la nuova riga) e la fine del file (stringa vuota).

+0

tHanks, ha funzionato :) –

+0

semplice e diretto al punto. Ottima soluzione. – Jiraheta

6

si potrebbe utilizzare il .rstrip() metodo di oggetti stringa per ottenere una versione con spazi bianchi finali (incluse le nuove linee) rimossa.

Esempio:

find_root(file.rstrip()) 
+0

puoi dirmi la sintassi? Voglio dire come e dove dovrei aggiungere questo? –

+0

Vedere l'esempio modificato. – Amber

+0

grazie :) ha funzionato –

1

E 'lo stile meglio utilizzare un gestore di contesto per il file, e len() invece di chiamare .__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

Hai dimenticato di menzionare che il buon stile di Python include anche di non nascondere i built-in con i tuoi nomi, come 'file' ... – martineau

+0

@martineau, Sì, lascio una diapositiva poiché è deprecata –

1

Per rimuovere il carattere di nuova riga fro alla fine si potrebbe anche usare qualcosa di simile:

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

L'ho programmato solo per curiosità. Di seguito sono riportati i risultati per un file di dimensioni diverse.

tldr; La lettura del file e la divisione sembra essere l'approccio più veloce su un file di grandi dimensioni.

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

Tuttavia, se avete bisogno di collegare attraverso le linee in ogni caso, allora probabilmente si desidera:

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() 

Risultati:

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 

Il file letto poi diviso sembra essere il faste st approccio su un file di grandi dimensioni.

Nota: leggere quindi dividere ("\ n") avrà una stringa vuota aggiuntiva alla fine dell'elenco.

Nota: leggere quindi splitlines() per ottenere più di "\ n" eventualmente "\ r \ n".

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

"Se" condizione controllerà se la linea ha stringa o no, se sì riga successiva metterà a nudo la "\ n" alla fine e scrivere in un file. Codice testato. ;)

1

Un caso d'uso con la risposta di @ 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" 
Problemi correlati