Seite 1 von 1

Anfänger: In textdatei nur in bestimmte Zeile schreiben?

Verfasst: Freitag 25. September 2009, 19:04
von chrave
Hallo an alle,

ich habe eine Einsteigerfrage:

Kann ich Python beibringen bei bestimmten Bedingungen nur zur 2. Zeile einer Textdatei hinzuzufügen? Oder CSV?

Aktuell habe ich 3 Arten von InformationsTypen und ein Script, welches Infos zu Typ1 in Zeile 1 schreibt, dann mache ich einen Zeilenumbruch und es wird Typ2 in Zeile 2 geschrieben und dann nach einem erneuten Zeilenumbruch in Zeile 3.

Zieht ca. so aus ;-):
müller, meier, schmidt
hans, peter, werner
CDU, SPD, Pirat

Wenn ich das Script, welches mir Informationen sammelt nun auf eine andere Datei laufen lasse möchte ich, dass Typ1 wieder in Zeile 1 kommt, Typ2 in Zeile 2 und Typ3 in Zeile 3! Geht das irgendwie? Kann ich dem Script sagen wieder in Zeile 1 anzufangen und dort Sachen hinzuzuschreiben? Zum Beispiel findet er einen Vornamen, also soll er jetzt hinter werner noch den neuen Vornamen schreiben?

Meine txt soll also wie eine kleine Datenbank fungieren, ähnlich einer CSV, nur halt Spalten und Zeilen transponiert! Leider kann man bei CSV auch nur ganze Zeilen schreiben, oder? Es würde mir auch helfen, wenn man in einer CSV bei getroffenem Kriterium halt nur zur 3. Spalte ein Feld hinzufügen kann? Geht das?

Verfasst: Freitag 25. September 2009, 19:23
von Defnull
Nicht, ohne die Datei vorher komplett zu lesen und auseinander zu fummeln. Du musst die Datei parsen und anschließend komplett neu schreiben. Ein Grund, warum deine Art der Speicherung denkbar ungünstig ist.

Prinzipiell könnte es so funktionieren:

Code: Alles auswählen

with open('beispiel.txt') as fp:
  cname = fp.readline().strip().split(', ').append('Hans')
  fname = fp.readline().strip().split(', ').append('Herbert')
  party = fp.readline().strip().split(', ').append('Grüne')
with open('beispiel.txt', 'w') as fp: 
  fp.write(', '.join(cname) + '\n')
  fp.write(', '.join(fname) + '\n')
  fp.write(', '.join(party) + '\n')

Verfasst: Freitag 25. September 2009, 19:54
von noisefloor
Hallo,

zum reine Lesen kannst du Zeilen auch gezielt mit seek() anspringen. Das funktioniert beim Schreiben aber AFIAK nicht, d.h. du kannst nicht sagen "Schreib das und das in die 2. Zeile" (korrigiert mich, wenn das nicht stimmt.

Wie defnull schon sagt, in einer Datei, die laufend ergänzt wird ist sowas ungünstig. Besser wäre eine einfache DB. :-)

Gruß, noisefloor

Verfasst: Freitag 25. September 2009, 20:53
von EyDu
Der Ansatz mit seek bringt aber nur dann etwas, wenn man weiß wo die Zeilen liegen. Das trifft im allgemeinen Fall natürlich nicht so recht zu.

Ich würde aber auch eine Datenbank empfehlen. Wenn du es schön einfach haben willst, dann benutze SQLite. Wenn du einen möglichst einfachen Ansatz willst und es die auf Geschwindigkeit oder komplexe Suchoperationen nicht drauf ankommt, dann kannst du auch einfach die gesamte Datei neu schreiben. Entweder per Hand, mit dem [mod]csv[/mod]-Modul oder mit dem [mod]pickle[/mod]-Modul.

Verfasst: Samstag 26. September 2009, 00:57
von chrave
Hallo,

danke schonmal für die Antworten. Das mit dem alles einlesen und anschließend neu schreiben klingt natürlich etwas rechenaufwändig, aber der leichteste Schritt bis jetzt.

Ich bin mir nicht im Klaren darüber, was es bedeutet eine Datenbank mit Python anzulegen? Wie würde das funktionieren? Ich beherrsche SQL (die Query Sprache) recht gut und habe sie auch schon benutzt, nur fehlt mir zum Anlegen noch jegliche praktische Erfahrung. Was wären da die ersten Schritte?

Verfasst: Samstag 26. September 2009, 01:03
von EyDu
Hallo.

Aufwendig wird es erst bei sehr vielen Daten. So eine schöne Datenbank ist allerdings viel komfortabler. Schau der mal die Doku zum SQLite-Modul an. Dort gibt es auch eine Menge Beispiele. Wenn du wenigen Absätze Einleitung gelesen hast, dann kannst du auch ganz schnell loslegen. Nur zur "execute"-Methode solltest du dir noch einmal gesondert anschauen, wie du Parameter übergeben kannst.

Verfasst: Samstag 26. September 2009, 12:57
von noisefloor
Hallo,

SQL + Python ist recht simpel, da es eine einheitliche API zum Zugriff auf SQL-DBs gibt.

Tutorials gibt es dazu sehr viele, aber auf der Seite http://docs.python.org/library/sqlite3.html ist direkt im ersten Beispiel alles drin, was man zum anfang braucht:
  • DB öffnen
    Verbindungs-Cursor setzen
    SQL Befehl
    SQL Befehl ausführen (Commit)
Da SQLite in der Standard-Python Distribution seit Version 2.5 drin ist kannst du auch ziemlich sicher sein ,dass dein Code auf den meisten Rechnern mit Python läuft.

Gruß, noisefloor