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

Montag 7. August 2006, 15:06

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

Montag 7. August 2006, 15:21

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:

Montag 7. August 2006, 15:50

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

Montag 7. August 2006, 16:14

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

Montag 7. August 2006, 16:17

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)

Montag 7. August 2006, 16:27

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

Montag 7. August 2006, 16:32

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

Montag 7. August 2006, 16:58

:oops: Peinlich sowas...


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

Montag 7. August 2006, 18:36

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!

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Montag 7. August 2006, 20:49

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

Montag 7. August 2006, 21:58

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 8. August 2006, 16:11

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)

CMS in Python: http://www.pylucid.org
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

Mittwoch 9. August 2006, 12:12

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.
Antworten