Daten aus Textdatei in andere Textdatei schreiben

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.
danpy
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2012, 07:09

Beschäftige mich seit heute morgen mit Python.
Bin wahrscheinlich noch die Stufe vor einen Anfänger. lol

Ok, werde jetzt erstmal etwas zu den Schleifen lesen.
danpy
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2012, 07:09

Guten Morgen

habe jetzt über die Schleifen gelesen und da fehlt im Code eine Variabel.
Sollte eigentlich so aussehen: for i in

Habe mir überlegt anders an die Lösung heranzugehen.

Hier ist der Code on Sirius.

Code: Alles auswählen

import re
REG_PARSE=re.compile(r'<Datei[^>]*Titel="\s*([^"]*?)\s*"[^>]*>\s*\1\s*(.*?\n)\s*</Datei>',re.DOTALL)
with open(filename) as infile:
    for outfilename, text = REG_PARSE.finditer(infile.read()):
        with open('%s.txt'%outfilename,'w') as outf:
            outf.write(text)

Ich werde der Reihe nach abarbeiten was der Code macht.
Wenn ich das richtig verstehe steht in der ersten Zeile das die Datei von bis eingelesen wird.

Code: Alles auswählen

REG_PARSE=re.compile(r'<Datei[^>]*Titel="\s*([^"]*?)\s*"[^>]*>\s*\1\s*(.*?\n)\s*</Datei>',re.DOTALL)
Habe nun versucht mit print das auszugeben bekomme aber nur eine Fehlermeldung

Code: Alles auswählen

import re
REG_PARSE=re.compile(r'<Datei[^>]*title="\s*([^"]*?)\s*"[^>]*>\s*\1\s*(.*?\n)\s*</Datei>',re.DOTALL)
with open(file) as infile:
print "REG_PARSE"
Fehlermeldung

Code: Alles auswählen

File "schritt.py", line 4
    print "REG_PARSE"
        ^
IndentationError: expected an indented block
Was mache ich falsch?
BlackJack

@danpy: Bei der Schleife fehlt keine Variable — es gibt ja sogar zwei — sondern das ``=`` müsste ein ``in`` sein.

In der ersten Zeile wird nichts eingelesen sondern ein regulärer Ausdruck in ein Objekt übersetzt mit dem man diesen Audruck auf Zeichenketten anwenden kann. Und ein ``print "REG_PARSE"`` gibt nicht einmal dieses Objekt aus, sondern einfach den Text „REG_PARSE”.

Die Fehlermeldung sagt eigentlich ziemlich deutlich dass dort ein eingerückter Block erwartet wird. Einrückung ist ein wesentlicher Bestandteil von Python's Syntax und wird deshalb in jedem halbwegs vernünftigen Tutorial bei den ersten Kontrollstrukturen behandelt bei denen der Compiler wissen muss welcher Code zu einem Block gehört.

Du solltest die konkrete Aufgabe vielleicht erst einmal zurück stellen und ein ganz allgemeines Python-Tutorial durcharbeiten um die Grundlagen bis mindestens zum Definieren von eigenen Funktionen zu lernen. In der Python-Dokumentation ist ein Tutorial und Learn Python The Hard Way scheint für Anfänger ganz gut zu sein (nicht vom Namen abschrecken lassen).

Reguläre Ausdrücke sind eine Sprache für sich und auch nicht nur auf Python beschränkt. Mindestens eine Bibliothek dafür findet man für viele Programmiersprachen. Darüber gibt es also auch unabhängig von Python-Dokumentation Tutorials und Bücher. Auf Python bezogen gibt es in der Python-Dokumentation neben der Referenz zum `re`-Modul noch das Regular Expression HOWTO.
danpy
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2012, 07:09

Ok, dann ist dieser Code anscheinend nichts für mich und der Sirius hat da irgend etwas zusammengeschrieben.


Werde dann meine Frage nochmal stellen:

Ich habe eine Datei die so aussieht:

Code: Alles auswählen

<Datei Kennung="4bc78" Titel="Morgen 1" Bereich="I847YP" > Morgen 1

Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.

</Datei>
<Datei Kennung="469" Titel="Trop Hall W " Bereich="izr" > Trop Hall W

Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.


</Datei>
<Datei Kennung="4bc78" Titel="Morgen 1" Bereich="I847YP" > Morgen 1

Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.

</Datei>
<Datei Kennung="4bc78" Titel="Morgen 1" Bereich="I847YP" > Morgen 1

Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.

</Datei>
<Datei Kennung="4bc78" Titel="Morgen 1" Bereich="I847YP" > Morgen 1

Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.

</Datei>
<Datei Kennung="4bc78" Titel="Morgen 1" Bereich="I847YP" > Morgen 1

Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.

</Datei>

Wollte dann ein Script schreiben das mir viele Dateien ausgibt die genauso heißen wie jeweils der Titel
und mit folgenden Inhalt

Code: Alles auswählen

Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.
Hier kommt ein Text aus Zahlen und Buchstaben, bestehend aus mehreren Zeilen.



Bevor ich das Sript schreibe muss ich erstmal wissen was es machen soll.
Hier mein Plan dazu:

1. Textdatei einlesen
2. das erste mal den Bereich <Datei ........ </Datei> einlesen und
3. neue Datei erstellen mit dem Inhalt vom gerade eingelesenen
4. Name der Datei wird gebildet vom Wert des Titels
5. Aus dieser Datei dann entfernen was in der ersten Zeile steht von <Datei Kennung="....." Titel="........" Bereich="....." >
und letzte Zeile entfernen </Datei>.
6. Wieder vorn anfangen und den nächsten Bereich einlesen.



Ist dieser Ablauf so in Ordnung oder sollte eine andere Reihenfolge gewählt werden?

Ich habe diese Frage schonmal gestellt, daraufhin habe ich eigentlich keine gescheite Antwort bekommen!
Sondern nur eigentlich nur darüber philosophiert ob das xml ist oder nicht.

Bitte diesmal keine Codes posten oder diskutieren über Datei xml ja oder nein!

Einfach nur sagen ob mein Plan so funktionieren könnte, wenn nicht dann sagen was ich daran ändern sollte.

Grüße
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

danpy hat geschrieben:Ok, dann ist dieser Code anscheinend nichts für mich und der Sirius hat da irgend etwas zusammengeschrieben.
Ähhhm ... nein. Das du den Code nicht zum Laufen bekommst liegt eher an deinen mangelnden Pythonkenntnissen als an der kleinen Unachtsamkeit von Sirius3.
Das Leben ist wie ein Tennisball.
danpy
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2012, 07:09

Dann werde ich diese Aussage zurückziehen und mich bei Sirius hiermit entschuldigen.
Hoffe mal Sirius sieht das nicht so streng?
BlackJack

@danpy: 1. würde ich nicht explizit machen. Da die Datei zeilenweise organisiert ist, kann man sie beim zeilenweisen Einlesen verarbeiten, ohne dass man die gesamte Datei auf einmal in den Speicher lesen muss.

Wenn das ein Ablaufplan sein soll, dann muss 4. vor 3. kommen, denn zum Anlegen der Datei benötigt man ja den Dateinamen.

Und 5. solltest Du auch vor 3. ziehen, denn man kann aus Dateien nicht einfach etwas entfernen. Das geht nur in Spezialfällen und ist auch dann noch umständlicher und ineffizienter als die Daten, die man dort nicht drin haben möchte, gar nicht erst in die Datei zu schreiben. Wenn Du so einen <Datei>-Abschnitt in eine passende Datenstruktur eingelesen hast, ist es aber sehr einfach nur die gewünschten Zeilen in die Datei zu schreiben.
danpy
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2012, 07:09

1. Textdatei zeilenweise einlesen
2. das erste mal den Bereich <Datei ........ </Datei> einlesen und gleichzeitig das unerwünschte entfernen
3. neue Datei erstellen mit dem Wert von Titel
4. in die neue Datei den Text reinschreiben
5. Wieder vorn anfangen und den nächsten Bereich einlesen.


Habe den Ablauf so abgeändert wie Blackjack vorschlägt.
Bei diesen Ablauf kann ich den Wert vom Titel aber nicht rausfinden, weil ich den gelöscht habe.

Ist das ein Denkfehler on mir?

Ich würde das so machen, kombiniert mit den Vorschlägen on Blackjack.

1. Textdatei zeilenweise einlesen
2. das erste mal den Bereich <Datei ........ </Datei>
3. neue Datei erstellen mit dem Wert von Titel
4. bei dem Bereich <Datei ........ </Datei> das unerwünschte entfernen
5. in die neue Datei den Text reinschreiben der von 4. übrig geblieben ist
6. Wieder vorn anfangen und den nächsten Bereich einlesen.

Was sagt Ihr dazu?
Bin ich auf der richtigen Fährte?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo danpy,

sorry für meine Unachtsamkeit. Man sollte einfach nicht im Forumseditor programmieren ;-)
Erinnert mich an meine Informatikklausuren, wo es punktabzug gab, wenn man einen Strichpunkt
vergessen hatte.

Nochmal eine Frage zu Anfang: Hast Du schon Erfahrung mit irgend einer Art von
Programmierung?

Man kann zum Beispiel die Zeile mit <datei ...> in eine Variable, nennen wir sie "kopf"
speichern und den Rest in eine zweite, "inhalt". Dann geht auch der Titel nicht verloren
und ist dennoch vom Inhalt getrennt.

Grüße
Sirius
BlackJack

@danpy: Ich ging nicht davon aus, dass etwas „entfernt” wird, sondern das einfach etwas nicht geschrieben wird. Ob man die ersten und letzten Zeilen tatsächlich in der Datenstruktur entfernt oder einfach nur die Daten dazwischen in eine Datei schreibt, macht keinen wirklichen Unterschied.

1. und 2. sind eigentlich keine getrennten Punkte. Und bei zweitens sollte das „das erste mal” aus der Beschreibung verschwinden. Das wird zwar auch das erste mal gemacht, aber eben auch genau so bei jedem weiteren <Datei>-Abschnitt. Punkt 2. wäre also „<Datei>-Abschnitt zeilenweise einlesen.”

1. <Datei>-Abschnitt zeilenweise in eine Datenstruktur einlesen.
2. Zieldateinamen aus erster Zeile ermitteln.
3. Zeilen ausser den ersten und letzten Beiden in die Zieldatei schreiben.
4. Wieder zu 1.

Man muss sich dann noch überlegen wie man mit dem Ende der Eingabedatei umgeht und auf welche Sonderfälle man bei „kaputten” Dateien achten muss. Zum Beispiel sicherstellen, dass die zweite und vorletzte Zeile von einem <Datei>-Abschnitt tatsächlich leer ist. Und das die Datei auch mit '</Datei>' endet.

1-3 sind auf jeden Fall gute Kandidaten für Funktionen.
danpy
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2012, 07:09

Sirius3 hat geschrieben: Hallo danpy
sorry für meine Unachtsamkeit. Man sollte einfach nicht im Forumseditor programmieren ;-)
Erinnert mich an meine Informatikklausuren, wo es punktabzug gab, wenn man einen Strichpunkt
vergessen hatte.

Nochmal eine Frage zu Anfang: Hast Du schon Erfahrung mit irgend einer Art von
Programmierung?

Man kann zum Beispiel die Zeile mit <datei ...> in eine Variable, nennen wir sie "kopf"
speichern und den Rest in eine zweite, "inhalt". Dann geht auch der Titel nicht verloren
und ist dennoch vom Inhalt getrennt.

Grüße
Sirius
Nicht schlecht einfach so aus dem Kopf ein Script schreiben.

Ich brauche meistens einen Plan wenn es zu kompliziert wird.

Programmierung habe ich leider noch nie gemacht.
Habe jetzt mal Python genommen, weil mir die Strukturen von den Scripten gefallen haben.
Die sehen irgendwie schön aus.
BlackJack hat geschrieben:@danpy: Ich ging nicht davon aus, dass etwas „entfernt” wird, sondern das einfach etwas nicht geschrieben wird. Ob man die ersten und letzten Zeilen tatsächlich in der Datenstruktur entfernt oder einfach nur die Daten dazwischen in eine Datei schreibt, macht keinen wirklichen Unterschied.

1. und 2. sind eigentlich keine getrennten Punkte. Und bei zweitens sollte das „das erste mal” aus der Beschreibung verschwinden. Das wird zwar auch das erste mal gemacht, aber eben auch genau so bei jedem weiteren <Datei>-Abschnitt. Punkt 2. wäre also „<Datei>-Abschnitt zeilenweise einlesen.”

1. <Datei>-Abschnitt zeilenweise in eine Datenstruktur einlesen.
2. Zieldateinamen aus erster Zeile ermitteln.
3. Zeilen ausser den ersten und letzten Beiden in die Zieldatei schreiben.
4. Wieder zu 1.

Man muss sich dann noch überlegen wie man mit dem Ende der Eingabedatei umgeht und auf welche Sonderfälle man bei „kaputten” Dateien achten muss. Zum Beispiel sicherstellen, dass die zweite und vorletzte Zeile von einem <Datei>-Abschnitt tatsächlich leer ist. Und das die Datei auch mit '</Datei>' endet.

1-3 sind auf jeden Fall gute Kandidaten für Funktionen.
1. <Datei>-Abschnitt zeilenweise in eine Datenstruktur(Kopfteil, Mittelteil, Endteil) einlesen.
2. Zieldateinamen aus dem Kopfteil ermitteln.
3. Zieldatei erstellen
4. in die Zieldatei den Mittelteil schreiben
5. Wieder zu 1.

Das müsste dann wahrscheinlich passen, auf die Sonderfälle kann ich später eingehen, falls ich das erstmal hinbekomme.

Werde jetzt ein bissl über Datei zeilenweise einlesen, Datenstruktur und Funktionen lesen.
Hoffe mal das mir der Kopf danach nicht zusehr raucht. :D
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

danpy hat geschrieben:Werde jetzt ein bissl über Datei zeilenweise einlesen, Datenstruktur und Funktionen lesen.
Es ist schade, dass du das Lernen aufgegeben und die Trash-Lösung aus Stackoverflow übernommen hast.
danpy
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2012, 07:09

/me hat geschrieben:Es ist schade, dass du das Lernen aufgegeben und die Trash-Lösung aus Stackoverflow übernommen hast.
Hallo

das Lernen habe ich nicht aufgegeben, werde noch weiterlesen um irgendwann ein eigenes Programm zuschreiben.
Zum jetzigen Zeitpunkt muss ich mir aber selber eingestehen, das es nicht möglich ist für mich ein derartiges Programm zuschreiben, da muss man einfach zuviel wissen in kurzer Zeit und wollte es bis zum 24. fertig haben.
Mir bringt es nichts wenn ich etwas über Funktionen und Datenstrukturen lese und nicht richtig verstehe.
Ich muss ganz am Anfang anfangen.
Mittendrin anfangen bringt mir nichts. Ich muss die Grundlagen verstehn, sonst wird das nichts mit dem Programmieren.


Hatte mir das einfacher vorgestellt.
Hinterher ist man immer schlauer.
Das Programm von Stackoverflow ist erstmal nur eine Übergangslöung für mich.

Wünsche allen geruhsame und Frohe Weihnachten
curly
User
Beiträge: 3
Registriert: Sonntag 10. Juli 2011, 17:36

Ergänzung:

Um Sirius3 Code zum Laufen zu bekommen, sollte man noch finditer gegen findall austauschen. Sonst bekommt man ein

Code: Alles auswählen

Traceback (most recent call last):
  File "forum-30664.py", line 8, in <module>
    for outfilename, text in REG_PARSE.finditer(infile.read()):
TypeError: '_sre.SRE_Match' object is not iterable
Gruß curly

P.S.: Habe dabei aber nicht wirklich Ahnung von der Materie, lese nur zum Vergnügen hier ab und zu mal mit. Probiere selten dann mal codesnippets aus. Hier bin ich durch einen Blick in die von BlackJack genannte Referenz zum `re`-Modul draufgekommen.
Antworten