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
Zeile löschen
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()
Zuletzt geändert von Nirven am Montag 7. August 2006, 15:23, insgesamt 1-mal geändert.
-
- 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.
Gruss
Du löschst die 4. Zeile da eine Liste beim Index 0 beginnt.
Code: Alles auswählen
del lines[0] # 1. Zeile
Zum schreiben kann man `f.writelines()` verwenden. Dann spart man sich eine explizite Schleife.
- 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
r+ ist für lesen und schreiben, wenn das file nicht existiert, tja pech gehabt
- 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.
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
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:
Grüße,
der Michel
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.
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).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
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)
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()
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
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.
- 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 :
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)
An der Stelle http://docs.python.org/lib/built-in-funcs.html#l2h-52 steht das: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)").
Also irgendwie ein wenig wiedersprüchlich das ganze! Was ist also das "echte" Objekt und was wirklich der Alias???open(filename[, mode[, bufsize]])
An alias for the file() function above.
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)
- 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:
http://docs.python.org/dev/lib/built-in-funcs.html
Unter anderem steht da:
Und in 2.5 sind file und open übrigens nicht mehr das gleiche. "file" ist der Typ und "open" eine Funktion.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)").
-
- 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
Danke im Voraus
-
- 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.
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.
- __blackjack__
- User
- Beiträge: 13144
- 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.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
-
- 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