Inhalt mehrerer Dateien in eine einzige Datei tun

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
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

Hallo zusammen :wink: ,

ich habe im Moment eine Programmieraufgabe in Python. Es existieren sehr viele ganz normale .txt-Dateien; ich habe den Inhalt dieser Dateien in eine einzige Datei zu mergen.
Eine Datei kann man mit open() öffnen, danach weiss ich leider nicht mehr weiter. :oops:

Vielleicht könnt Ihr mir ja mal helfen. Ich bedanke mich schon mal.

Viele Grüße aus der Eifel,

Ratna
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und dann oeffnet man eben noch die Dateien, die man auslesen will und schreibt sie in die neue Datei, wo is das Problem?
BlackJack

@ratna_fong: Du kannst Dir selbst helfen. Das Tutorial durcharbeiten und die relevante Dokumentation lesen. Zum Beispiel die zu Dateiobjekten. Das `os`- und das `os.path`-Modul enthalten vielleicht auch die eine oder andere nützliche Funktion. Ausserdem solltest Du Dich über die ``with``-Anweisung schlau machen.
Warhead
User
Beiträge: 15
Registriert: Montag 28. Juni 2010, 12:54

Kurze Verständnisfrage ratna_fong ...

Solltest Du die einzelnen Dateien mergen oder sie einfach nur aneinander in diese einzelne besagte Datei anhängen?
When altering one's own mind becomes as easy as programming a computer… What does it mean to be human?
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

ich soll den inhalt der dateien mergen. Sagen wir mal, die erste Datei beinhaltet 3 Zeilen:
zeile eins
zeile zwei
zeile drei

Die zweite Datei beinhaltet 2 Zeilen:
zeile vier
zeile fünf

Am Ende soll eine ganz NEUE Datei rauskommen, die dies beinhaltet:

zeile eins
zeile zwei
zeile drei
zeile vier
zeile fünf

Ich bin dankbar für jede Hilfestellung.

Ich habe nebenbei noch eine Frage bzgl. Textdatei. Ich habe folgendes gefunden:
The key difference between text files and binary files is that text files are composed of octets, or bytes, of binary data whereby each byte represents a character and the end of the file is marked by a special byte pattern, known generically as end of file, or eof. A binary file contains arbitrary binary data and thus no specific value can be used to identify end of file, thus a different mode of operation is required to read these files. The end result of this is that when we open a binary file in Python (or indeed any other language) we must specify that it is being opened in binary mode or risk the data being read being truncated at the first eof character that Python finds in the data. The way we do this in Python is to add a 'b' to the mode parameter.

Nun, zur Sicherung dass ich das richtig verstanden habe, mache ich mal ein Beispiel:
Ist das also so, dass eine Textdatei:

text

01001010 10100010 01010000 01110101 00001010 00001011
t e x t \ n


Ist das richtig so? :oops:
Ich bin mir nämlich nicht sicher.

Gruss, Ratna
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

ratna_fong hat geschrieben:ich soll den inhalt der dateien mergen.
Sicher? Dein Beispiel zeigt anhängen.
ratna_fong hat geschrieben:Ich bin dankbar für jede Hilfestellung.
Zeige Code bzw. beschreibe wie du vorgehen willst. Dann können wir dir helfen.
ratna_fong hat geschrieben:Ich habe nebenbei noch eine Frage bzgl. Textdatei. Ich habe folgendes gefunden: [...]
Wo hast du das aufgetrieben? Ist das immer noch Teil von Pythons Dokumentation? Ein spezielles Zeichen als EOF gab es mal bei CP/M und wurde dann in den Anfangsjahren von DOS übernommen, aber darauf trifft man eigentlich nie mehr. Den Begriff "Octet" benutzen Pedanten, die darauf bestehen, dass ein Byte (wie es in den Anfangstagen der Computerei vorkam) nicht notwendigerweise aus 8 Bits besteht. Bei einem Octet ist das immer der Fall. Den Unterschied zwischen Textdateien und Binärdateien würde ich daran fest machen, dass man bei einer Textdatei die Octets speziell interpretiert. Es gibt eine Sequenz, die ein Zeilenende beschreibt. Dies kann das Byte 10, das Byte 13 oder die Kombination 13 gefolgt von 10 sein. Außerdem definiert ein sogenanntes Encoding, wie Bytes in Zeichen konvertiert werden. Das Byte 65 beschreibt in der Kodierung ASCII, ISO-8859-1, CP1252 oder UTF-8 jeweils das "A". Ein "Ä" hingegen gibt es in der Kodierung ASCII gar nicht, in ISO-8859 und CP1252 ist es 196 und bei UTF-8 sind es zwei Bytes: 195 gefolgt von 132. Python 2.x benutzt in Unicode-Strings (das sind die, denen ein u vorgestellt ist) und Python 3.x bei allen Strings den Unicode-Zeichensatz, der über 100.000 Zeichen jeweils einen Wert (den sogenannten codepoint) zuordnet. Aus Gründen der Kompatibilität ist der Codepoint von A "zufällig" 65 und der von Ä 196. Da ein Byte ja nur 8 Bits hat (was für Zahlen von 0 bis 255 reicht), könnte man mit nur einem Byte pro Zeichen niemals alle Unicode-Zeichen darstellen. Man könnte nun jeweils 2 oder 4 Bytes pro Zeichen benutzen, aber da das Textdateien extrem aufblähen würde, behilft man sich mit komplizierteren aber platzsparenden Kodierungen wie UTF-8 oder UTF-16.

Stefan
BlackJack

@sma: Auf das EOF-Zeichen trifft man bei Windows. Wenn man da so etwas macht wie ``data = open('test.bin').read()`` läuft man Gefahr, dass dabei nicht die ganze Datei gelesen wird, sondern nur bis zum ersten EOF-Zeichen. Windows hört da tatsächlich auf beim Lesen.
Warhead
User
Beiträge: 15
Registriert: Montag 28. Juni 2010, 12:54

Okay ratna,

Du solltest Dich dann neben den Python Basics auch zusätzlich mit der Thematik beschäftigen: "Was ist mergen und wie mache ich das?"

Ganz platt gesagt, gibt es keinen alleskönnenden und universellen Merge-Befehl in Python. Merging ist ein komplexes Thema für sich, und gerade dann besonders, wenn es um das mergen von Dateien (nicht sortierten Listen) geht.

Speziell in Deinem beschriebenen Szenario z.B. stellt sich alleine bereits die Frage hinsichtlich des Verhaltens (oder des erwarteten Resultats) bei unterschiedlicher Reihenfolge der Dateien -sprich: wenn zuerst Datei2 und dann Datei1 eingelesen werden. Erwartest Du dann immer noch:

Code: Alles auswählen

zeile eins
zeile zwei
zeile drei
zeile vier
zeile fünf
oder doch eher:

Code: Alles auswählen

zeile vier
zeile fünf
zeile eins
zeile zwei
zeile drei
?

Falls die Programmieraufgabe Unterrichtsbezogen ist, würde ich das Thema nochmal lieber beim Aufgabensteller genauer hinterfragen. Sicherlich kann man per-hand ein File-Merging in Python realisieren, lustig ist das aber nicht ;).

Sollte die Aufgabe jedoch einem realen Problem zu Grunde liegen, so würde ich vielleicht nicht unbedingt versuchen das Rad neu zu erfinden, sondern bestehende "Merge-Tools" in mein Python Script zu integrieren.

Z.B. unter Windows: WinMerge unter Verwendung des CommandLine Interfaces

Viele Grüße
#War
When altering one's own mind becomes as easy as programming a computer… What does it mean to be human?
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

mmhh.. ich hätte nicht gedacht, dass die Lösung scheinbar nicht trivial ist.

Die Zeilen müssen NICHT sortiert sein am Ende. Es ist also ganz schlicht, falls z.b 2 Dateien existieren, jeweils mit 3 Zeilen:
Datei 1:

Tobias
Wolfgang
Ratna

Datei 2:
Kim
Paul
Brigitte

Es soll am Ende "lediglich" EINE Datei mit dem Inhalt sein:

Tobias
Wolfgang
Ratna
Kim
Paul
Brigitte


Mit der Unterscheidung zwischen Textfile und Binärfile, das war eigentlich das Ergebnis, als ich rausfinden wollte, warum die Methode open("datei.txt", rb). noch das zusätzliches b verwendet. Wie oben beschrieben, halt damit keine Kollition von end line Zeichen passiert.

Ich danke für Eure Hilfe.

Grüße, Ratna
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

die Aufgabe ist sehr einfach, wenn du die Dateien aneinander hängen willst. Das Mergen ist recht komplex aber das willst du ja nicht (laut Beispiel).

1. bestehende Datei 1 lesend öffnen.
2. neue Datei zum schreiben öffnen / erstellen.
3. Datei 1 auslesen und in neue Datei schreiben.
4. Datei 1 schliessen.
5. bestehende Datei 2 lesend öffnen.
6. Datei 2 auslesen und in neue Datei schreiben.
7. Datei 2 schliessen.
8. neue Datei schliessen.

so geht das...
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Code: Alles auswählen

final = open("Final.txt", "w")
while True:
    name = raw_input("Dateiname: ")
    if name == "":
        break
    temp = open(name + ".txt", "r")
    for line in temp:
        final.write(line.strip())
    temp.close()
final.close()
Ist nicht getestet, musst du gucken, ob das klappt ^^
Dies ist keine Signatur!
Warhead
User
Beiträge: 15
Registriert: Montag 28. Juni 2010, 12:54

ratna_fong hat geschrieben:...
Die Zeilen müssen NICHT sortiert sein am Ende. Es ist also ganz schlicht, falls z.b 2 Dateien existieren, jeweils mit 3 Zeilen:
Datei 1:

Tobias
Wolfgang
Ratna

Datei 2:
Kim
Paul
Brigitte

Es soll am Ende "lediglich" EINE Datei mit dem Inhalt sein:

Tobias
Wolfgang
Ratna
Kim
Paul
Brigitte
...
... anhand Deiner gewählten Beispieldaten, trifft Dein gestelltes Beispielresultat auch weiterhin sowohl für einen Merge als auch für ein Zusammenfügen (Konsolidierung, Anhängen, wie auch immer Du es nennen magst) zu.

Da Du Pumuckel aber immer noch nicht auf die Frage: "willst Du mergen oder anhängen" (die auch von anderen hier mehrfach gestellt, bzw. in Bezug auf Deine genannten Beispiel in Frage gestellt wurde) eine eindeutige Antwort gegeben hast, solltest Du für den Anfang doch lieber beim anhängen bleiben:

Code: Alles auswählen

with open("C:\\all.txt", "w") as all:
    for filepath in ["c:\\test1.txt", "c:\\test2.txt"]:
        with open(filepath, "r") as f:
            all.write(f.read())
Zuletzt geändert von Warhead am Montag 5. Juli 2010, 21:32, insgesamt 1-mal geändert.
When altering one's own mind becomes as easy as programming a computer… What does it mean to be human?
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

vielen lieben Dank :D für die Hilfe und vor allen Dingen für die Codes, sie haben mir sehr sehr viel geholfen. Habe heute noch angepasst, es hat wunderbar geklappt. : :o

Grüße, Ratna :oops:
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

P.S. Verwende als Variable nicht `all`, das ist ein Keyword, wie du vielleicht auch siehst ;)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
BlackJack

@ms4py: <pedantic>Kein Keyword -- nur der Name einer "eingebauten" Funktion.</pedantic>
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

BlackJack hat geschrieben:@ms4py: <pedantic>Kein Keyword -- nur der Name einer "eingebauten" Funktion.</pedantic>
*seufz* :K

;)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Antworten