Zeile 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.
Jerala
User
Beiträge: 9
Registriert: Montag 7. August 2006, 15:03

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
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

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'?
Zuletzt geändert von Nirven am Montag 7. August 2006, 15:23, insgesamt 1-mal geändert.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

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

Code: Alles auswählen

del lines[0] # 1. Zeile
Gruss
BlackJack

Zum schreiben kann man `f.writelines()` verwenden. Dann spart man sich eine explizite Schleife.
Jerala
User
Beiträge: 9
Registriert: Montag 7. August 2006, 15:03

Danke für die schnelle antwort werde es schnell testen,
die ersten 3 zeilen hatte ich aber schon richtig ;-)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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 ;)
Jerala
User
Beiträge: 9
Registriert: Montag 7. August 2006, 15:03

klappt!

nur statt

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

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

benutzt.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

:oops: Peinlich sowas...


Danke wegen dem w+/r+, muss ich mal testen :)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
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. :-)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
TheRaccoon
User
Beiträge: 9
Registriert: Mittwoch 12. Mai 2021, 10:35

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 :)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Alle eins lesen, nur die letzte wegschreiben.
TheRaccoon
User
Beiträge: 9
Registriert: Mittwoch 12. Mai 2021, 10:35

???
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.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
TheRaccoon
User
Beiträge: 9
Registriert: Mittwoch 12. Mai 2021, 10:35

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann nimm doch einfach nur die letzte Zeile aus der Datei. liste_aller_zeilen[-1]. Viel simpler gehts doch nicht.
Antworten