Zeile aus txt file löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Yoqora
User
Beiträge: 7
Registriert: Mittwoch 13. Dezember 2017, 09:27

Hallo,
ich habe ein .txt file, in dem folgendes steht:

Code: Alles auswählen


1,2
3,1
4,3
7,2
Also in der ersten Zeile steht nichts.. geht es irgendwie, dass ich diese Zeile lösche, also sozusagen alle Zeilen um eine nach vorne verschiebe?
oder ist das nicht möglich? Ich möchte nämlich aus diesen Daten einen Graph mit matplotlib erstellen und wenn in der Zeile nichts steht bekomme
ich den Error "list index out of range". Sobald die erste Zeile nicht mehr frei ist, geht es. Also kann ich das irgendwie machen?
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Du musst die Datei zeilenweise einlesen. Mit der strip Methode entfernst du whitespace, womit eine solche Zeile leer wird. Dann behältst du nur die nicht-leeren Zeilen. Und schreibst die weg oder benutzt io.StringIO um eine Datei zu simulieren.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich weiß nicht, was du brauchst, einfach mal etwas Quellcode - Ansatz 1 würde ich wahrscheinlich nutzen, wenn die Datei genauso aussieht, wie du schreibst:

Code: Alles auswählen

# Ansatz 1
with open("source.txt") as f:
    rawdata = f.readlines()[1:]

data = [list(map(int, item.split(","))) for item in rawdata]


# Ansatz 2
with open("source.txt") as f:
    rawdata = f.readlines()

data = []
for line in rawdata:
    if line == "\n":
        pass
    else:
        line = line.strip("\n")
        column1, column2 = line.split(",")
        data.append([column1, int(column2)])

print(data)


# Ansatz 3
with open("source.txt") as f:
    rawdata = f.readlines()

data = []
for i, line in enumerate(rawdata):
    if i >= 1:
        line = line.strip("\n")
        column1, column2 = line.split(",")
        data.append([column1, int(column2)])

print(data)
Bei Ansatz 2 nutze ich eine konkrete Abfrage, welche Zeilen ich überspringen will. Bei Ansatz 3 verlasse ich mich darauf, dass es tatsächlich um die erste Zeile geht.

Hast du überlegt von .txt auf .csv zu wechseln? In der Standardbibliothek gibt es das csv-Modul, dass das Arbeiten mit csv-Dateien erleichtert. Deine Daten sehen aus wie csv...
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

@pixewakb das csv Modul kümmert sich nicht um die dateiendung. Testen auf „not line.strip()“ ist deinem Vergleich mit einem newline überlegen weil es auch Leerzeichen oder \r eliminiert. Und alles per Readlines einzulesen um danach über eben diese zu iterieren ist eigentlich überflüssig.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Yoqora: normalerweise zeigt man, was man versucht hat, und wo man konkret scheitert. numy.genfromtxt kennt z.B. ein `skiprows`. Bei File-Objekten kann man mit `header = next(lines)` eine einzelne Zeile lesen.

@pixewakb: bei Iteratoren kann man auch mit `islice` bestimmte Bereiche selectieren.
Antworten