readline() überprüfen

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
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

Hallo Community,

ich schreibe gerade für mich hier in der Firma einen kleinen Notizblock. Was man so an Freeware oder in Outlook findet ist nicht unbedingt das, was ich suche, also versuche ich mich einfach mal selbst dran einen zu schreiben.


Er soll nicht viel können, aber die funktionsweise hab ich mir so gedacht:

-> in einer Datei werden die Notizen nach folgendem Muster abgelegt:

<id>|<titel>|<content>\n
<id>|<... u.s.w.

-> das Programm soll immer eine Zeile auslesen

->mit hilfe von split() will ich das | Zeichen erkennen und mir eine Liste zurückgeben lassen:

list = [("<id>", "<titel>", "content"]


Das Ausleseverfahren hab ich mir so vorgestellt, dass ich mit readline() immer eine Zeile auslese, verarbeite und dann zur nächsten springe. Das habe ich mir eine while-Schleife vor. Aber wie kann ich überprüfen, ob readline() nicht schon unten angekommen ist?

Meine Idee war:

Code: Alles auswählen

while line=fp.readline():
    ...
Aber geklappt hat das nicht. Auch (line=fp.readline())==True hat nicht geklappt. Ich habe leider keine Idee, wie ich das hinbekommen könnte.

Freue mich auf Antwort
Kuttengeier
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

Sry für den Doppelpost, aber ich habe das problem inzwischen gelöst.

1. Ich weiß nicht, ob es readline() gibt, aber ich nutze jetzt readlines() :)
2. Statt while ne for schleife

Naja, ich will euch meinen Code einfach mal zur Verfügung stellen. Für Kritik und Verbesserungsvorschläge bin ich immer offen. Je mehr gemeckert wird, desto mehr lerne ich :)

Code: Alles auswählen

fp=open("notes.txt", "r")

line = fp.readlines()

for i in range(len(line)):
	line[i] = line[i].split("|")
	line[i][2].replace("\n", "")
	print line[i][0]+"|"+line[i][1]+"|"+line[i][2]

fp.close()
Das replace() macht noch nicht ganz, was es soll, aber das bekomme ich schon noch iwie in den griff. Hoffe ich jedenfalls :)

MfG
Kuttengeier

.:edit:.
Auch den fehler behoben. Musste die änderung in einer Variablen speichern. Zum nachvollziehen nochmal der neue Text:

Code: Alles auswählen

for i in range(len(line)):
	line[i] = line[i].split("|")
	line[i][2] = line[i][2].replace("\n", " ")
	print line[i][0]+"|"+line[i][1]+"|"+line[i][2]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``readlines()`` ist eine Krücke, die schon längst nicht mehr nötig ist:

Code: Alles auswählen

from __future__ import with_statement

with open('notes.txt', 'r') as fp:
    for line in fp:
        print line
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

Hmm... sieht ja ganz elegant aus.

Könntest du erklären, was da pasiert? ^^ Ich werd da nich schlau draus. Hab zwar schon geguckt im Net, auch in der PyDocu, aber ich versteh das modul und die with anweisung irgendwie nicht.

Kuttengeier

.:edit:.
Das in diesem Modul viele Funktionen sind, die später mal standart werden sollen hab ich bereits rausgefunden
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

ok, danke :)

Habs verstanden.

Danke,
Kuttengeier
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Wenn du mal Zeit und Lust hast, solltest du dich mal mit (py)sqlite beschäftigen. Warum das Rad (Datenbank) zweimal erfinden?
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

Weil ich erstmal eine kleine Simple lösung haben wollte. Ohne SQL oder so. Das ist mir für soeine kleinigkeit zuviel Aufwand. Wenn ich das Skript weiterentwickle und wenn es größer wird kann man sich das nochmal durch den Kopf gehen lassen, aber das sind jetzt mit Kommentaren 30 Zeilen Code. Ich finde ne DB is dafür zuviel Aufwand. Jedenfalls erstmal.

Aber trotzdem danke, werde ich demnächst mal probieren. Einfach um es zu lernen.

Kuttengeier
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Kuttengeier hat geschrieben:

Code: Alles auswählen

print line[i][0]+"|"+line[i][1]+"|"+line[i][2]
Mehr python-like wäre:

Code: Alles auswählen

print '|'.join(line[i])
P.S.

Code: Alles auswählen

for line in fp:
funktioniert natürlich auch ohne das with-Statement, das es ja erst seit Python 2.5 gibt.
MfG
HWK
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

original von HWK
funktioniert natürlich auch ohne das with-Statement, das es ja erst seit Python 2.5 gibt.
Naja, kann ich es gleich mit einlernen. Schaden kann es ja nicht :)

Das mit dem join() werde ich umsetzen, danke ;)

Kuttengeier
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kuttengeier hat geschrieben:Weil ich erstmal eine kleine Simple lösung haben wollte. Ohne SQL oder so.
Eine simple Lösung würde ``pickle`` verwenden. Das ist einfacher als Textdateien zu schreiben und zu parsen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

Leonidas hat geschrieben:Eine simple Lösung würde ``pickle`` verwenden.
Das kannte ich bis eben noch nicht, aber danke, ich werd es bei gelegenheit ausprobieren.

Kuttengeier
lunar

Leonidas hat geschrieben:
Kuttengeier hat geschrieben:Weil ich erstmal eine kleine Simple lösung haben wollte. Ohne SQL oder so.
Eine simple Lösung würde ``pickle`` verwenden. Das ist einfacher als Textdateien zu schreiben und zu parsen.
Dafür ist das Datenformat von Pickle nicht portabel... Ich wüsste nicht, wie ich Pickle-Dateien in Java auslesen könnte.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Dafür ist das Datenformat von Pickle nicht portabel... Ich wüsste nicht, wie ich Pickle-Dateien in Java auslesen könnte.
Ich glaube, dass blackbird mal das pickle-Protokoll in PHP implementiert hat. So würde es eben auch in Java gehen.

pickle ist nun mal die einfachste Lösung, denn die einfachste Lösung muss nicht portabel sein. Es ging ja darum, das Notizprogramm in Python zu schreiben und nicht in Java.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

Ja, ich möchte nur ein Pythonprogramm und beabsichtige es auch nicht es in Java oder eine andere Sprache zu portieren, also reicht das ja.

Und wenn es notwenig sein sollte denke ich, werde ich auf Datenbanken zurückgreifen.

Kuttengeier
BlackJack

Bei Java sollte das "entpickeln" mit Jython gehen.

Falls es doch eine simple Textdatei mit Trennzeichen sein soll, würde ich auf jeden Fall das `csv`-Modul aus der Standardbibliothek vorschlagen, anstatt das mit `split()` und `join()` selber zu bauen. Das Modul kommt auch automatisch damit zurecht, wenn Werte das Trennzeichen oder Zeilenumbrüche enthalten.
Benutzeravatar
Kuttengeier
User
Beiträge: 27
Registriert: Freitag 17. August 2007, 07:04

Danke,

ich werde aber erstmal auf Pickle zurückgreifen und im Anschluss csv probieren. Was mir dann besser gefällt nutze ich dann weiter.

So long,
Kuttengeier
Antworten