2012-09-08 5 views
192

In PythonLesen einer Datei ohne Zeilenumbrüche

temp = open(filename,'r').readlines() 

Ergebnisse in einer Liste aufrufen, in dem jedes Element eine Zeile in der Datei ist. Es ist ein wenig dumm, aber immer noch: readlines() schreibt auch Newline-Zeichen zu jedem Element, etwas, das ich nicht passieren möchte. Wie kann ich es vermeiden?

+2

Verwenden Strip: '[l.strip ('\ n \ r') für L in temp]'. Oder sogar 'rstrip'. Und seit Iteration kann es hier "offen" statt "in Temp" sein. – gorlum0

+13

Diese Frage ist verantwortlich für jeden Reputationswert, den ich habe – Yotam

+3

Ich wäre nett, wenn es in Python 3 einen Wert geben würde, um das 'newline'-Argument von open zu diesen chomped trailing newlines zu setzen. – jxramos

Antwort

276

Sie können die gesamte Datei und Trennlinien str.splitlines mit lesen:

temp = file.read().splitlines() 

Oder Sie können von Hand das Newline Streifen:

temp = [line[:-1] for line in file] 

Hinweis: diese letzte Lösung funktioniert nur, wenn die Datei endet mit einem Zeilenumbruch, sonst verliert die letzte Zeile ein Zeichen.

Diese Annahme ist in den meisten Fällen wahr (besonders für Dateien, die von Texteditoren erstellt wurden, die oft tun fügen Sie eine End-Zeilenumbruch sowieso).

Wenn Sie dies vermeiden wollen Sie eine neue Zeile am Ende der Datei hinzufügen:

with open(the_file, 'r+') as f: 
    f.seek(-1, 2) # go at the end of the file 
    if f.read(1) != '\n': 
     # add missing newline if not already present 
     f.write('\n') 
     f.flush() 
     f.seek(0) 
    lines = [line[:-1] for line in f] 

Oder eine einfachere Alternative zu strip die Newline statt:

[line.rstrip('\n') for line in file] 

Oder sogar, obwohl ziemlich unlesbar:

[line[:-(line[-1] == '\n') or len(line)+1] for line in file] 

Welche nutzt die Tatsache, dass die Rückkehr va lue von or ist kein boolescher Wert, sondern das Objekt, das als wahr oder falsch ausgewertet wurde.


readlines Die Methode ist eigentlich äquivalent zu:

def readlines(self): 
    lines = [] 
    for line in iter(self.readline, ''): 
     lines.append(line) 
    return lines 

# or equivalently 

def readlines(self): 
    lines = [] 
    while True: 
     line = self.readline() 
     if not line: 
      break 
     lines.append(line) 
    return lines 

readline() Da die Neue-Zeile hält auch readlines() es hält.

Hinweis: für Symmetrie readlines() die writelines() Methode macht nicht hinzufügen Zeilenumbrüche am Ende, so f2.writelines(f.readlines()) eine exakte Kopie von f in f2 produziert.

+0

Beachten Sie, dass '' [line.rstrip ('\ n') für Zeile in Datei] '' mehr als ein nachstehendes '' \ n'' entfernt. –

+0

Einfacher, '' [Zeile [:-(Zeile [-1] == '\ n') oder len (Zeile) +1] für Zeile in Datei] '' könnte stattdessen '' [Zeile [:-(line [-1] == '\ n') oder None] für Zeile in Datei] ''. –

+0

Diese Lösungen lesen die gesamte Datei in den Speicher. Wenn Sie die eckigen Klammern eines Listenverständnisses in Klammern ändern, wird ein Generatorausdruck erzeugt, mit dem Sie Zeile für Zeile über die Datei iterieren können: '0 für Zeilenumbruch (x.strip() für x in f):' – velotron

19
temp = open(filename,'r').read().split('\n') 
+8

Was würde allerdings mit '\ r \ n'-Zeilenumbrüchen passieren? ;) – Wolph

+0

@WoLpH Ja, ich habe die plattformspezifischen Zeilenumbrüche nicht berücksichtigt. Es wird das Falsche geben. – vivek

+11

Python behandelt automatisch universelle Zeilenumbrüche, daher wird '.split ('\ n')' unabhängig von der Newline-Konvention richtig aufgeteilt. Es wäre wichtig, wenn Sie die Datei im Binärmodus lesen würden. In diesem Fall behandelt 'splitlines()' universelle Zeilenumbrüche, während 'split (' \ n ') 'dies nicht tut. – Bakuriu

-2
def getText(): 
    file=open("ex1.txt","r"); 

    names=file.read().split("\n"); 
    for x,word in enumerate(names): 
     if(len(word)>=20): 
      return 0; 
      print "length of ",word,"is over 20" 
      break; 
     if(x==20): 
      return 0; 
      break; 
    else: 
     return names; 


def show(names): 
    for word in names: 
     len_set=len(set(word)) 
     print word," ",len_set 


for i in range(1): 

    names=getText(); 
    if(names!=0): 
     show(names); 
    else: 
     break; 
1
import csv 

with open(filename) as f: 
    csvreader = csv.reader(f) 
    for line in csvreader: 
     print(line[0]) 
2
temp = open(filename,'r').read().splitlines() 
0

Diese Versuchen:

u=open("url.txt","r") 
url=u.read().replace('\n','') 
print(url) 
+1

Während dieses Code-Snippet die Frage lösen kann, hilft [einschließlich einer Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erläuternden Kommentaren zu überladen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen verringert! – FrankerZ