Seite 1 von 2

Zeile löschen

Verfasst: Montag 7. August 2006, 15:06
von Jerala
Ich habe eine Datei, in der Werte aufgelistet sind:

X Y
1 10
2 3
3 7
4 9

usw. jetzt möchte ich ein kurzes script schreiben, das mir die erste Zeile in dieser datei löscht. Wie geht das?? Ich muss ja irgendwie die Datei aufrufen, und sagen, dass Zeile nr. 3 (z.B) weg soll, ich find aber nicht raus wie das geht.

Hoffe, es kann mir Anfänger einer helfen!
Jerala

Verfasst: Montag 7. August 2006, 15:21
von Nirven

Code: Alles auswählen

f = file('DeineDatei','r')
lines = f.readlines()
f.close()

del lines[3]    #Hier wird die dritte Zeile gelöscht

f = file('DeineDatei','w')  

for l in lines:
    f.write(l)

f.close()
So sollte es funktionieren. Geht das auch ohne die Datei doppelt zu öffnen? Vielleicht mit 'rw'?

Verfasst: Montag 7. August 2006, 15:50
von rayo
Hi

Du löschst die 4. Zeile da eine Liste beim Index 0 beginnt.

Code: Alles auswählen

del lines[0] # 1. Zeile
Gruss

Verfasst: Montag 7. August 2006, 16:14
von BlackJack
Zum schreiben kann man `f.writelines()` verwenden. Dann spart man sich eine explizite Schleife.

Verfasst: Montag 7. August 2006, 16:17
von Jerala
Danke für die schnelle antwort werde es schnell testen,
die ersten 3 zeilen hatte ich aber schon richtig ;-)

Verfasst: Montag 7. August 2006, 16:27
von DatenMetzgerX
w+ sollte für lesen und schreiben sein und wenn das File noch nicht existiert wird es angelegt
r+ ist für lesen und schreiben, wenn das file nicht existiert, tja pech gehabt ;)

Verfasst: Montag 7. August 2006, 16:32
von Jerala
klappt!

nur statt

f = file('DeineDatei','r')

f = open('DeineDatei','r')

benutzt.

Verfasst: Montag 7. August 2006, 16:58
von Nirven
:oops: Peinlich sowas...


Danke wegen dem w+/r+, muss ich mal testen :)

Verfasst: Montag 7. August 2006, 18:36
von jens
Jerala hat geschrieben:nur statt

f = file('DeineDatei','r')

f = open('DeineDatei','r')

benutzt.
Hm??? Ist beide das selbe! IMHO ist "file" die neuere Variante, ich benutzt eigentlich nur diese!

Verfasst: Montag 7. August 2006, 20:49
von Michael Schneider
Hi,


um meinen bescheidenen Senf noch dazuzugeben: ich möchte in der Doku mal gelesen haben, dass <file> der eigentliche Klassenname ist und <open> lediglich einen aus Bequemlichkeitsgründen (?) eingeführten Konstruktor darstellt. Aber in beiden Fällen wird eine Instanz der Klasse <file> erzeugt.
w+ sollte für lesen und schreiben sein und wenn das File noch nicht existiert wird es angelegt
r+ ist für lesen und schreiben, wenn das file nicht existiert, tja pech gehabt
Der Hauptunterschied zwischen "r+" und "w+" ist, dass "r+" die Datei zum Lesen öffnet und Schreiben zulässt, während "w+" erstmal tabula rasa macht (eine leere Datei anlegt), egal ob sie existiert und was drin steht (stand).

Beim Öffnen im erweiterten read/write Modus ist zu beachten wo der Filepointer steht. Denn wenn man die Datei vollständig gelesen hat, steht er am Dateiende und muss vor dem Schreiben mit

Code: Alles auswählen

f.seek(0)
an den Dateianfang gesetzt werden. Ferner befinden sich nach dem Kürzen am Ende der Datei noch Zeichen, die nicht mehr benötigt werden und abgeschnitten werden müssen!

Zudem dauert das zeilenweise Lesen und Schreiben länger. Ich würde den gesamten String einlesen, die i-te Zeile cutten und das Ergebnis wieder speichern:

Code: Alles auswählen

def remove_line(s, iLineToRemove):
    import re
    cre = re.compile(r"^(?P<teil1>(?:.*?\n){%i}).*?\n(?P<teil2>.*)$" % (iLineToRemove-1), re.MULTILINE + re.DOTALL)
    res = cre.search(s)
    if res:
        d = res.groupdict()
        return d.get("teil1") + d.get("teil2")
    else:
        print "Zeile %i konnte nicht entfernt werden" % iLineToRemove
        return s

f = open('test.dat','r+')
s = f.read()                                ##  ganzen Inhalt lesen
f.seek(0)                                   ##  zurueck zum Beginn der Datei
f.write(remove_line(s, iLineToRemove = 2))  ##  gekuerzten String speichern
f.truncate()                                ##  wichtig! entfernt alle uebrigen Zeichen der Datei
f.close()
Grüße,
der Michel

Verfasst: Montag 7. August 2006, 21:58
von BlackJack
Laut Guido soll man weiterhin `open()` zum öffnen von Dateien benutzen. `file` wurde als Alias eingeführt, als man von eingebauten Typen erben konnte. ``class MyFile(open):`` sieht halt irgendwie blöd aus. :-)

Verfasst: Dienstag 8. August 2006, 16:11
von jens
Aus der Doku http://docs.python.org/lib/built-in-funcs.html#l2h-25 :
file(filename[, mode[, bufsize]])
...
The file() constructor is new in Python 2.2 and is an alias for open(). Both spellings are equivalent. The intent is for open() to continue to be preferred for use as a factory function which returns a new file object. The spelling, file is more suited to type testing (for example, writing "isinstance(f, file)").
An der Stelle http://docs.python.org/lib/built-in-funcs.html#l2h-52 steht das:
open(filename[, mode[, bufsize]])
An alias for the file() function above.
Also irgendwie ein wenig wiedersprüchlich das ganze! Was ist also das "echte" Objekt und was wirklich der Alias???

In der Doku selber wird anscheinend öfters von file() als von open() geredet, wie z.B. hier:
http://docs.python.org/lib/bltin-file-objects.html
anders aber hier:
http://docs.python.org/ref/types.html#l2h-132

Mr. goolge sagt das:
file() site:http://docs.python.org - ungefähr 11.400 Treffer
open() site:http://docs.python.org - ungefähr 424 Treffer

Das bestätigt mich, weil ich immer file() benutzte... Erscheint mir auch ein klein wenig treffender, als open() (Ist aber wohl Geschmackssache)

Verfasst: Mittwoch 9. August 2006, 12:12
von birkenfeld
Da darf ich dich enttäuschen, Jens:

http://docs.python.org/dev/lib/built-in-funcs.html

Unter anderem steht da:
When opening a file, it's preferable to use open() instead of invoking this constructor directly. file is more suited to type testing (for example, writing "isinstance(f, file)").
Und in 2.5 sind file und open übrigens nicht mehr das gleiche. "file" ist der Typ und "open" eine Funktion.

Re: Zeile löschen

Verfasst: Mittwoch 12. Mai 2021, 10:40
von TheRaccoon
Ja Hallo, ich habe ungefähr das gleiche problem mit dem unterschied das ich alle Zeilen bis auf die letzte die erstellt wurde gerne löschen würde. Hätte dazu jemand zufällig eine Idee?
Danke im Voraus :)

Re: Zeile löschen

Verfasst: Mittwoch 12. Mai 2021, 11:53
von __deets__
Alle eins lesen, nur die letzte wegschreiben.

Re: Zeile löschen

Verfasst: Mittwoch 12. Mai 2021, 13:06
von TheRaccoon
???
Meine Frage war das ich über eine Serielle Schnittstelle dauerhaft daten bekomme und abspeicher, ich brauche aber nur alle 6 Stunde die neuste Zeile der Rest müsste Automatisch gelöscht werden.

Re: Zeile löschen

Verfasst: Mittwoch 12. Mai 2021, 13:55
von __deets__
Ja und? Du hast eine Datei, da sind Zeilen drin, du willst alle bis auf die letzte wegschmeißen - das macht man so, wie ich’s beschrieben habe. Was daran ist unklar?

Re: Zeile löschen

Verfasst: Mittwoch 12. Mai 2021, 14:06
von __blackjack__
Wobei man auch schon beim Abspeichern dafür sorgen könnte, dass man immer nur eine Zeile in der Datei hat, wenn man nur eine Zeile benötigt.

Re: Zeile löschen

Verfasst: Mittwoch 12. Mai 2021, 14:25
von TheRaccoon
Nein das funktioniert leider nicht da die Zeilen von einem Sensor benötigt werden damit er hochzählen kann. Mein Problem ist das ich mit dieser Datei eine Tabelle automatisch ausfüllen lasse, diese trägt aber alle aufgenommenen Daten ein ich benötige aber nur die neuste. Da der Raspberry komplett automatisch arbeitet brauche eine Methode alle anderen daten automatisch zu löschen

Re: Zeile löschen

Verfasst: Mittwoch 12. Mai 2021, 14:51
von __deets__
Dann nimm doch einfach nur die letzte Zeile aus der Datei. liste_aller_zeilen[-1]. Viel simpler gehts doch nicht.