Seite 1 von 1

Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Samstag 3. Juli 2010, 10:56
von ratna_fong
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

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Samstag 3. Juli 2010, 10:59
von cofi
Und dann oeffnet man eben noch die Dateien, die man auslesen will und schreibt sie in die neue Datei, wo is das Problem?

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Samstag 3. Juli 2010, 11:10
von 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.

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Samstag 3. Juli 2010, 11:36
von Warhead
Kurze Verständnisfrage ratna_fong ...

Solltest Du die einzelnen Dateien mergen oder sie einfach nur aneinander in diese einzelne besagte Datei anhängen?

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Samstag 3. Juli 2010, 14:28
von ratna_fong
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

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Samstag 3. Juli 2010, 23:09
von sma
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

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Sonntag 4. Juli 2010, 06:43
von 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.

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Sonntag 4. Juli 2010, 08:08
von Warhead
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

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Sonntag 4. Juli 2010, 10:55
von ratna_fong
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

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Sonntag 4. Juli 2010, 11:00
von DaMutz
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...

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Sonntag 4. Juli 2010, 19:59
von Shaldy

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 ^^

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Montag 5. Juli 2010, 14:19
von Warhead
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())

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Montag 5. Juli 2010, 17:03
von ratna_fong
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:

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Montag 5. Juli 2010, 19:17
von ms4py
P.S. Verwende als Variable nicht `all`, das ist ein Keyword, wie du vielleicht auch siehst ;)

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Montag 5. Juli 2010, 20:05
von BlackJack
@ms4py: <pedantic>Kein Keyword -- nur der Name einer "eingebauten" Funktion.</pedantic>

Re: Inhalt mehrerer Dateien in eine einzige Datei tun

Verfasst: Dienstag 6. Juli 2010, 22:11
von ms4py
BlackJack hat geschrieben:@ms4py: <pedantic>Kein Keyword -- nur der Name einer "eingebauten" Funktion.</pedantic>
*seufz* :K

;)