Seite 1 von 1

Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 12:54
von Tobs
Hi,

ich habe vor kurzem angefangen ein Programm zu schreiben, dass sich Informationen aus eine Textdatei holt, damit ich es leichter mit neuen Informationen "füttern" kann.

Immer 3 Zeilen repräsentieren ein Objekt:

1.Objekt(1.Zeile,2.Zeile,3.Zeile)
2.Objekt(4.Zeile,5.Zeile,6.Zeile)
3.Objekt(7.Zeile,8.Zeile,9.Zeile)
...

Hat jemand eine Idee, wie ich das anstellen könnte?

(Ich weiß, dass ich es auch mit Sonderzeichen getrennt in eine Zeile schreiben könnte, aber das wäre dann beim "füttern" unübersichtlich)

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 13:11
von Hyperion
Wie wäre es, wenn Du das ganze mit einem existierenden Format lösen würdest, etwa JSON, YAML oder XML? Wenn es wirklich nur auf das temporäre Serialisieren ankommt, wäre ``pickle`` auch noch eine Option.

Um aber auf die Frage (aus der Überschrift) zurück zu kommen: Du kannst ja über die Zeilen einer Textdatei einfach iterieren. Du könntest dazu einen Index erstellen (``enumerate``) und mittels Modulo-Berechnung prüfen, ob eine Zeile gelesen bzw. präziser weiterverarbeitet werden soll oder nicht.

Alternativ fiele mir noch ``itertools.cycle`` ein, um eine bestimmte, sich wiederholende Sequenz zu generieren.

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 13:19
von Balmung
Auch eine mögliche Antwort wäre mit zip() oder itertools.zip_longest() (oder itertools.izip_longest() wenn python2):

Code: Alles auswählen

with open('thefile', 'r') as f:
    for line1, line2, line3 in itertools.zip_longest(f, f, f):  # oder: itertools.zip_longest(*([f]*3))
        obj = Objekt(line1, line2, line3)
        # blah..

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 13:30
von Tobs
Okay, danke mit itertools hats geklappt, auch wenn ich noch nicht ganz verstanden habe warum.

Wisst ihr wo ich die itertools.py herbekomme, damit es jemand anderes auch importieren kann,
oder ist es egal, wo das Programm auf dem Computer ausgeführt wird?

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 13:35
von Balmung
itertools gehört zur standard library von Python. Hast du Python installiert, dann ist itertools auch vorhanden.

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 14:06
von Hyperion
Tobs hat geschrieben:Okay, danke mit itertools hats geklappt, ...
Ich möchte Dir noch mal meinen ersten Vorschlag ans Herz legen! :-)

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 21:53
von Tobs
Mir fällt grad ein, dass ich ja auch 2 Zähler hätte nehmen können,
einen für die Zeilen, und einen von 1-3 der dann immer zurückgesetzt wird -,-
Aber die Lösung mit itertools sieht irgendwie besser aus...

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 21:55
von Tobs
Ich kenn die ganzen Formate net :(

Kannst du sie mir mal kurz mit Eigenschaften, Vor- und Nachteilen aufzählen?

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 22:26
von Tobs
Hast du mich gehackt :mrgreen: ? Jetzt sagt er dass itertools keine Attribut namens zip_longest hat :roll:

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Donnerstag 6. März 2014, 22:46
von /me
Tobs hat geschrieben:Jetzt sagt er dass itertools keine Attribut namens zip_longest hat :roll:
Und vorher ging es? Dann hast du vorher Python 3 verwendet und jetzt Python 2. Diese beiden Versionen sind (bewusst) nicht vollständig kompatibel.

Re: Nur jede x.Zeile aus einer Textdatei auslesen

Verfasst: Freitag 7. März 2014, 08:27
von Hyperion
Tobs hat geschrieben:Ich kenn die ganzen Formate net :(

Kannst du sie mir mal kurz mit Eigenschaften, Vor- und Nachteilen aufzählen?
Äh...nö ;-) Aber Du kannst dazu ja selber mal etwas recherchieren!

Primär ging es mir eher darum, dass Du das Rad nicht neu erfinden musst! Python hat bereits in Modul für das Verarbeiten von JSON mit an Bord: ``json``. Schau Dir dazu die Doku an; das Laden und Speichern geht extrem simpel. Du musst dann lediglich noch die gelesenen Daten nutzen, um Deine Objekte zu erzeugen.

Mal ein Beispiel:

Code: Alles auswählen

class User:
    def __init__(self, screenname, password):
        self.screenname = screenname
        self.password = password
    def __str__(self):
        return self.screenname

data = [
["Hyperion", "geheim"],
["Foo", "Bar"]
]

import json

s = json.dumps(data)

print(s)
> '[["Hyperion", "geheim"], ["Foo", "Bar"]]'

loaded_data = json.loads(s)

print(loaded_data)
> [['Hyperion', 'geheim'], ['Foo', 'Bar']]

users = [User(name, password) for name, password in loaded_data]

users
[<__main__.User at 0x48d8f98>, <__main__.User at 0x4995048>]

for user in users:
    print(user)

> Hyperion
> Foo

print(users[0].password)
> 'geheim'
JSON kann die Standard-Python Daten einfach serialisieren und deserialisieren. Du brauchst dann nur noch eine Fabrik-Funktion, die Dir aus solchen Datenobjekten (``data`` / ``loaded_data`` in diesem Beispiel) tatsächlich Deine Domänenobjekte (Objekte vom Typ ``User``) erstellt.

Ich habe mir das JSON natürlich durch Python generieren lassen; man kann es aber eben auch leicht von Hand schreiben.