Seite 1 von 1

.txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Sonntag 24. Januar 2016, 13:15
von matt34
Hallo,
Ich habe ein Textdokument mit in etwas 100.000 Zeilen in jeder Zeile die Werte 1,2,3,4,
Nun möchte ich aber ein Programm schreiben welches mir immer 10.000 Zeilen in eine neue Textdatei schreibt. Die werte sollen wie folgt angeordnet sein:
2
3
1
4

2
3
1
4

Ich bin gerade erst dabei Python zu lernen und bin über jede Antwort dankbar.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Sonntag 24. Januar 2016, 13:41
von Sirius3
@matt34: was hast Du schon versucht? Du weißt, wie man Dateien öffnet und zeilenweise liest? Du kennst for-Schleifen? Du weißt wie man etwas in eine Datei schreibt?

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Sonntag 24. Januar 2016, 14:02
von matt34
Ja wie man eine Datei öffnet, ließt und schreibt weis ich. Ich konnte den Inhalt der Datei auch schon in einem Array speichern aber nicht ordnen und dann 10.000 Zeilen in einem neuen Textdokument speichern.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Sonntag 24. Januar 2016, 16:05
von pixewakb
Du brauchst eine Zählervariable, d. h. zaehler = 0. Bei jedem Durchgang durch die Schleife +1 und dann prüfen, ob es bereits 10.000 erreicht hat, dann eine neue Datei öffnen (Namen generieren) und dorthinein schreiben. Poste mal deinen Quellcode bislang.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 17:47
von matt34
Wie schreibe ich jetzt eine Schleife die bei jeder Zeile, den Zähler(count) um 1 erhört? und dann automatisch bei 10.000 eine txt Datei erstellt und dann bei den nächsten 10.000 wieder eine?

Mein Quellcode:

Code: Alles auswählen

counter = 0

txt = open("test.txt", "r")
zeilen = txt.read()
txt.close()

if counter == 0:
    1txt = open("1.txt", "w")
    print("Dokument erstellt")
    1txt.write(zeilen)
    1txt.close()
    print("Fertig!")
    
else:
    print("Fehler!")
Danke für eure antworten!

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 18:01
von BlackJack
@matt34: Das kompiliert ja nicht mal. Quelltext ohne Syntaxfehler wäre schon nett. Und dann vielleicht wirklich mal mit der Materie beschäftigen. So was in `zeilen` enthalten ist, und was Du eigentlich haben möchtest. Oder was Schleifen sind und wie man sie einsetzt.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 18:44
von pixewakb
Textdokument mit in etwas 100.000 Zeilen in jeder Zeile die Werte 1,2,3,4
Um so eine Datei zu schreiben:

Code: Alles auswählen

import random

zahlen = ["1","2","3","4"]

with open("quelldatei.txt", "w") as f:
    for i in range(100000):

        random.shuffle(zahlen)
        f.write(",".join(zahlen) + "\n")

        print(i, zahlen)

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:07
von pixewakb
Ich konnte nicht widerstehen :roll:

Das ist der erste Wurf und m. E. nicht sehr effizient. Ich kann gerade mitansehen, wie Python Minuten-weise eine neue Datei auf die Platte schreibt. Um das zu lösen, könnte man das Einlesen und Speichern effizienter gestalten, d. h. möglicherweise möchtest Du dich daran versuchen:
(1) Den Quellcode verstehen (und damit spielen)
(2) Eine effizientere Schreibmethode entwickeln.
Zu (2) im Moment öffnet Python die Datei bei jedem Durchlauf neu, um eine Zeile anzuhängen (!). Das würde ich bei einer zweiten Version m. E. korrigieren.

Ansonsten: Brich dein Problem mal runter. Erzeuge - z. B. mit obigem Code - mal eine Datei mit 30 Zeilen und schreibe jeweils 5 Zeilen in eine Datei. Wenn Dir das gelingt, gehe auf 100.000 und 10.000 :D

Code: Alles auswählen

counter = 1
datei_counter = 1

daten = []

# Daten einlesen
with open("quelldatei.txt") as f:

    for line in f:

        a, b, c, d = line.replace("\n","").split(",")

        daten.extend([a, b, c, d, ""])

# Daten ausgeben
dateiname = "zieldatei {}.txt"

for zeile in daten:

    with open(dateiname.format(datei_counter), "a") as f:

        f.write(zeile + "\n")
    
    if counter == 10000:

        counter = 1
        datei_counter += 1

    else:
        counter += 1

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:15
von matt34
@BlackJack Ja du hast recht, der Code kompiliert nicht, ich hatte die Variablen Namen nachträglich geändert damit man sie leichter verstehen kann. In meinem Skript funktioniert es mit anderen Bezeichnungen der Variablen. Ich bin im Moment dabei zu lernen, wie ich auch bei meinem ersten Post geschrieben habe. Ich bin auch dabei mir Schleifen anzugucken. Meines Erachtens nach ist in zeilen eine Liste mit den Zeilen der Quelldatei? Wenn ich damit falsch liege korrigiere mich bitte.

@pixewakb Danke für deine Antwort, werde mir das gleich mal angucken :)

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:21
von pixewakb
Ich vermute, dass Du auf eigene Faust lernst!? Nach welchem Buch lernst Du!?

Schau dir mal an, wie ich eine Datei öffne und wie Du das machst. Deine Befehle stellen die alte Variante dar.

Schau Dir bei Gelegenheit noch mal dein Skript an und versuche Deine Logik und meine Logik zu verstehen. M. E. kloppst du den ganzen (!) Inhalt der Quelldatei jeweils in verschiedene Zieldateien, falls dein Skript lauffähig ist. BTW: Ist das eine Programmieraufgabe aus dem Buch (gibt es da eine Lösung (auf CD?)?)?

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:35
von BlackJack
@matt34: Ob `zeilen` an eine Liste mit Zeilen gebunden ist, kannst Du auch selbst prüfen. Einfach mal `type(zeilen)` ausgeben und lesen was `read()` als Ergebnis/Typ liefert.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:38
von matt34
Ja ich lerne auf eigene Faust, nicht nach einem Buch.

Ich bin gerade dabei deinen Code zu verstehen und die Logik dahinter zu verstehen. Wie dein Code die Daten ausgibt und den Counter für die Zeilen wieder auf 1 setzt und den Counter für die Datein um 1 erhört verstehe ich.

Code: Alles auswählen

a, b, c, d = line.replace("\n","").split(",")

daten.extend([a, b, c, d, ""])
.. verstehe ich noch nicht ganz, werde ich mir aber gleich mal genauer Anschauen.

Dein Skript hat mir jetzt schon sehr geholfen und konnte mir die Funktionen daran sehr gut selber erklären.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:39
von Sirius3
@pixewakb: da geht noch einiges. Als Anregung:

Code: Alles auswählen

from itertools import groupby
with open("quelldatei.txt") as f:
    for nr, lines in groupby(enumerate(f), lambda (a,b): a//10000):
        with open("ausgabe%04d.txt" % nr, "w") as out:
            out.writelines(l for _,l in lines)

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:45
von pixewakb
@Sirius3: Mir graust es immer noch vor lambda und itertools habe ich nicht auf dem Schirm. Was doof ist, aber ich komme nicht aus dem Bereich der Standardbibliothek vor und das leider auch gedanklich. Meine Überlegung wäre auch - ohne es zu testen -, ob man nur 100.000 * 5 / 10.000-Mal eine Datei öffnet und im Hauptprogramm direkt den Dateiinhalt zusammensetzt. Also 500.000 / 10.000 = 50 x statt in der Dauerschleife. Ich befürchte allerdings, dass das für den Thread-Starter noch zuweit weg ist.

@matt34: Ich halte das für keine gute Idee. Ich habe mit Weigend gute Erfahrung gemacht (Objekt-orientierte Programmierung mit Python oder so), allerdings ist da auch einiges nicht pythonisch. Ich hatte da die ersten 7, 8, vielleicht 10 Kapitel genau durchgearbeitet und es half, ein einigermaßen systematisches Wissen aufzubauen. Es gibt auch einige Online-Tutorials, die ganz ordentlich sind, u. a. das offizielle Python-Tutorial, allerdings auf Englisch.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:51
von matt34
@Sirius3 Durch deinen Code steige ich noch nicht so ganz durch :K

@pixewakb Ok, ich werde dann erstmal mit dem offiziellem Python-Tutorial arbeiten.

Vielen Dank für eure Antworten.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 19:56
von pixewakb
itertools ist ein Modul aus der Standardbibliothek, was besondere Schleifen-Konstrukte bietet, die für Spezialfälle genauer und besser passen.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 21:25
von pixewakb
BTW: Statte mal deiner Stadtbibliothek oder UB einen Besuch ab. I. d. R. gibt es dort gute Python-Literatur, bei beiden könntest du auch Anschaffungswünsche aufgeben.

Re: .txt auslesen, neu anordnen und in anderem .txt speichern

Verfasst: Dienstag 26. Januar 2016, 21:52
von BlackJack
@pixewakb: `itertools` ist nicht für Spezialfälle sondern enthält im Gegenteil sehr *allgemeine* Werkzeuge, die deshalb auf sehr viele Probleme passen.

``lambda`` ist eigentlich nichts wirklich besonderes wenn man Funktionsdefinitionen mit ``def`` verstanden hat, sollte der ”Sprung” zu ``lambda`` kein grösseres Problem darstellen. Es ist halt auch eine Funktionsdefinition, nur das die Funktionen keinen Namen hat, und nur aus einem einzelnen Ausdruck bestehen darf. Schreib Dir einfach jedes mal wenn Du ``lambda`` siehst, das ganze mal mit einer benannten Funktion mit ``def`` hin, dann sollte das Prinzip schnell klar werden und Du brauchst dieses ”mentale Stützrad” nicht lange.