2017-10-21 3 views
1

Ich mache einen Dateityp zum Speichern von Informationen aus meinem Programm. Der Dateityp kann Linien umfassen, beginnend mit #, wie:Entfernen Sie alle Elemente in der Liste beginnend mit #

# This is a comment. 

als Kommentar gezeigt ist, bezeichnet das # vor einer Linie. Ich habe ein Programm in Python geschrieben, das diese Dateien lesen kann:

fileData = [] 

file = open("Tutorial.rdsf", "r") 

line = file.readline() 

while line != "": 
    fileData.append(line) 
    line = file.readline() 

for item in list(fileData): 
    item.strip() 

fileData = list(map(lambda s: s.strip(), fileData)) 

print(fileData) 

Wie Sie sehen können, dauert es die Datei fügt hinzu, jede Zeile als ein Element in einer Liste, und streift die Elemente von \ n. So weit, ist es gut.

Aber oft enthalten diese Dateien Kommentare, die ich gemacht habe, und so fügt das Programm sie der Liste hinzu.

Gibt es eine Möglichkeit, alle Elemente in der Liste zu löschen, die mit # beginnen?

Edit: Um die Dinge etwas klarer: Kommentare wie dieser nicht sein wird:

Some code: 
{Some Code} #Foo 

Sie werden wie folgt sein:

#Foo 
Some code: 
{Some Code} 
+2

Verwenden Sie keine While-Schleife, sondern durchlaufen Sie die Datei direkt. Ihre 'readline' while-Schleife kann durch' fileData = file 'ersetzt werden.readlines() '(Plural) oder' fileData = Liste (Datei) '. –

+1

Ihre 'for'-Schleife, die die Linien streift, funktioniert überhaupt nicht, weil Sie die abisolierten Linien nie zurück zuweisen. Sie müssen 'list()' no ein Objekt nicht schon eine Liste aufrufen. –

+0

Siehe [Was ist perfektes Gegenstück in Python für "während nicht eof"] (0) stackoverflow.com/q/15599639) –

Antwort

0

Sie können Linien direkt in einem Prozess for Schleife:

with open("Tutorial.rdsf", "r") as file: 
    for line in file: 
     if line.startswith('#'): 
      continue # skip comments 
     line = line.strip() 

     # do more things with this line 

Nur sie in eine Liste setzen, wenn Sie Rando brauchen m Zugang (z.B. Sie müssen auf Linien bei bestimmten Indizes zugreifen).

Ich verwendete eine with Anweisung, um die geöffnete Datei zu verwalten, wenn Python das Ende des with Blocks erreicht, wird die Datei automatisch für Sie geschlossen.

+0

Minor Nitpick, wenn diese Code-Dateien sind, dann entfernt strip() Einzug (verwenden Sie rstrip stattdessen). –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ: Ich denke nicht, dass wir mit diesem kleinen Kontext einen Sprung machen müssen, und nicht jeder Code hängt vom Einrücken ab. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ: Wir wissen nicht einmal, ob vorangestelltes Leerzeichen vor dem '#' zählt. In meiner Antwort werden Zeilen mit Leerzeichen vor den '#' nicht ignoriert, in Ihrem sind sie. Beide sind gültige Ansätze. –

0

Beginnen Sie an der Spitze, verwenden Sie einen Kontextmanager, es ist einfacher mit Dateien zu arbeiten.

with open("Tutorial.rdsf", "r") as f: 
    code = [] 
    for line in f: 
     if not line.strip().startswith('#'): 
      code.append(line.rstrip()) 

Wenn Sie das Newline nicht entfernen lassen möchten, entfernen Sie den .rstrip Anruf.


Eine Alternative wäre, Ihre gesamte Datei einzulesen und dann Filter aufzurufen.

with open("Tutorial.rdsf", "r") as f: 
    code = filter(lambda x: not x.strip().startswith('#'), f.readlines()) 

Beachten Sie, dass die zweite Methode Ihre Zeilen mit der Hinter Newline anhängen.

+0

Das OP benötigt eine Liste von nicht abgestreiften Zeilen. –

+0

@MartijnPieters Ja, beide tun. Ich werde dafür eine Lösung hinzufügen, danke. –

-1

Es ist einfach, nach führenden Zeichen zu suchen. diese

Wechsel:

while line != "": 
    fileData.append(line) 
    line = file.readline() 

dazu:

while line != "": 
    if not line.startswith("#"): 
     fileData.append(line) 
    line = file.readline() 

Aber Ihr Programm ist ein bisschen kompliziert für das, was es tut. Sehen Sie in der Dokumentation nach, wo es erklärt for line in file:.

+1

Sie sollten überhaupt keine "while" -Schleife ** verwenden **. –

+0

@MartijnPieters: Ich habe das gesagt. – BoarGules

Verwandte Themen