Zeilen bis zu einer Zeile (z.b. 30000) einer Datei löschen Python3?

2 Antworten

dateiText = open("datei.txt", "r") # r steht füt read, also lesen
dateiTextListe = dateiText.split("\n") # macht den gesamten Text in eine Liste in der ein Item einer Zeile entspricht
index = 0 
while index < 30000:
  del dateiTextListe[0]
  index += 1
dateiText.close()
dateiText = open("datei.txt", "w")# w steht für write
index = 0
dateiTextNeu = ""
while index < len(dateiTextListe):
  dateiTextNeu += dateiTextListe[index] + "\n"
  index += 1
dateiText.write(dateiTextListe)
dateiText.close()

So ich hoffe einfach Mal das klappt :)

Habe es selber nicht ausprobiert also versuch es am besten erstmal mit einer Kopie deiner Datei


MistrX271  18.12.2019, 16:31
dateiText = open("test.txt", "r") # r steht füt read, also lesen
dateiTextListe = dateiText.read().split("\n") # macht den gesamten Text in eine Liste in der ein Item einer Zeile entspricht
index = 0 
while index < 10:
  del dateiTextListe[0]
  index += 1
dateiText.close()
dateiText = open("test.txt", "w")# w steht für write
index = 0
dateiTextNeu = ""
while index < len(dateiTextListe):
  dateiTextNeu += dateiTextListe[index] + "\n"
  index += 1
dateiText.write(dateiTextNeu)
dateiText.close()

So funktioniert es jetzt bei mir

1
MistrX271  18.12.2019, 16:40
@verreisterNutzer

Sind immerhin 30000 Zeilen und vermutlich nicht der aller effizienteste Code. Aber länger als ein paar Minuten sollte das eigentlich nicht dauern, denke ich.

1
Erzesel  18.12.2019, 17:33
@MistrX271

Ich bin zwar kein Pythonproger, aber warum den eingelesen Text zweimal abgrasen?

Das löschen der Arrayfelder ist Zeitverschwendung.

dateiText = open("test.txt", "r") # r steht füt read, also lesen
dateiTextListe = dateiText.read().split("\n") # macht den gesamten Text in eine Liste in der ein Item einer Zeile entspricht
# index auf erste neu zu schreibende Zeile, und ab geht die Luzie...;p
# die ersten 10 bzw 30000 Zeilen  interessieren  doch keinen mehr einfach vergessen...
index = 10
dateiTextNeu = ""
while index < len(dateiTextListe):
  dateiTextNeu += dateiTextListe[index] + "\n"
  index += 1
dateiText.write(dateiTextNeu)
dateiText.close()
0
verreisterNutzer  18.12.2019, 16:26

FEHLER: Traceback (most recent call last):

 File "C:/Users/NAME/Desktop/test.py", line 2, in <module>

  dateiTextListe = dateiText.split("\n") # macht den gesamten Text in eine Liste in der ein Item einer Zeile entspricht

AttributeError: '_io.TextIOWrapper' object has no attribute 'split'

Was ist da der Fehler???

0
MistrX271  18.12.2019, 16:28
@verreisterNutzer

dateiTextListe =dateiText.read().split("\n")

so ist das dann richtig...

Aber ich merke gerade das der Code nicht wirklich funktioniert :(

Ich schick dir gleich mal ein Update

1

Alternative Möglichkeit von StackOverflow, die wohl ein wenig performanter sein sollte:

n = 30000
nfirstlines = []

with open("input.txt") as f, open("tmp.txt", "w") as out:
    for x in xrange(n):
        nfirstlines.append(next(f))
    for line in f:
        out.write(line)

os.remove("input.txt")
os.rename("tmp.txt", "input.txt")

Quelle: https://stackoverflow.com/questions/42630639/how-to-read-and-delete-first-n-lines-from-file-in-python-elegant-solution

"n" ist hier die Anzahl der Zeilen, "input.txt" ist zu ersetzen durch den Dateinamen. "tmp.txt" ist nur eine temporäre Arbeitsdatei.

Wenn es nicht unbedingt Python sein muss, wäre "tail" auf Linux weitaus schneller:

tail -n +30000 input.txt > output.txt
Woher ich das weiß:Berufserfahrung – Inhaber einer App-Agentur & 15+ Jahre Programmiererfahrung

verreisterNutzer  18.12.2019, 17:21

Der Code ist aber ein bisschen Fehlerhaft sehe ich...

0