Lesen und Schreiben einer Textdatei

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
panasonic18
User
Beiträge: 4
Registriert: Sonntag 5. April 2020, 13:12

Hallo zusammen,

ich bin relativ neu im Python-Programmieren und komme bei meinem Problem nicht mehr weiter. Folgendes Problem habe ich:

Ich habe Ergebnisdateien in unterschiedlichen Dateipfäden. Mich interessiert jeweils nur ein Wert je Ergebisdatei. Zwei Dateien müssen je Pfad eingelesen werden und dann (als x,y-Werte für einen Plot) in einer neuen Datei (Ausgabe.dat) gespeichert werden.


Mein Code für einen Dateipfad habe ich bereits erstellt:

Code: Alles auswählen


InputFile1="Dateipfad1/Datei1.dat"
InputFile2="Dateipfad1/Datei2.dat"

with open (InputFile1,"r") as rf1:
	with open (InputFile2, "r") as rf2: 
		with open ("Ausgabe.dat","w") as wf: 
			data1 = rf1.readlines()[10]
			data2 = rf2.readlines()[25]
			wf.write("Variable1\n" + data1)
			wf.write("Variable2\n" + data2)
			

Problematischer wirds hierbei mit dem lesen aus mehreren Dateipfäden. Also für Dateipfad2,3,4 usw.. Meine Idee ist eine For-Schleife, allerdings hakt es bei der Implementierung. Vielleicht kann mir ja hier jemand weiterhelfen.

Viele Grüße
Sirius3
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

Das einzige, was für jede Eingabedatei gleich ist, ist die Ausgabedatei, also ersteinmal umschreiben.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.

Code: Alles auswählen

InputFile1="Dateipfad1/Datei1.dat"
InputFile2="Dateipfad1/Datei2.dat"

with open ("Ausgabe.dat","w") as wf: 
    with open (InputFile1,"r") as rf1:
        data1 = rf1.readlines()[10]
        wf.write("Variable1\n" + data1)
    with open (InputFile2, "r") as rf2:
        data2 = rf2.readlines()[25]
        wf.write("Variable2\n" + data2)
Pro Datei hast Du einen Dateinamen und eine Zeilennummer, Du brauchst also eine Datenstruktur, die beides zusammen speichert, mit der Du dann per for-Schleife iterieren kannst:

Code: Alles auswählen

[code=python]
input_data = [
    ("Dateipfad1/Datei1.dat", 10),
    ("Dateipfad1/Datei2.dat", 25),
]

with open ("Ausgabe.dat","w") as output:
    for index, (filename, linenumber) in enumerate(input_data, 1):
        with open(filename) as input:
            line = input.readlines()[linenumber]
            output.write(f"Variable{index}\n{line}")
Das Ausgabedateiformat ist etwas seltsam. Was sollen die Zeilen mit "Variable"? Die bieten doch gar keinen Mehrwert und machen das Lesen nur schwierig.
panasonic18
User
Beiträge: 4
Registriert: Sonntag 5. April 2020, 13:12

Danke für deine schnelle Rückmeldung. Allerdings verstehe ich deine Ausgabedatei nicht. Also:

Code: Alles auswählen

output.write(f"Variable{index}\n{line}")
So erhalte ich doch nur einen String aus str = "Variable{index}\n{line}" oder nicht?
Ich benötige den Variablenname, da ich mir den in tecplot direkt anzeigen lassen kann. Kann man aber auch weglassen.

Edit: Okay, den output kann ich nun nachvollziehen, mit output.write(line) werden mir die jeweiligen Werte ausgegen. Mein Hauptproblem ist jedoch, dass ich diese Dateien in 50+ Ordnern/Pfaden habe. Welche jeweils nach dem Schema Dateipfad_1, Dateipfad_2 ... durchnummeriert sind.
Sirius3
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn die Dateinamen einer Regel folgen, kannst Du sie natürlich auch generieren lassen.
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@panasonic18: Da ist ein f vor dem Zeichenkettenliteral, dass heisst die Ausdrücke in den geschweiften Klammern werden durch die Ergebnisse davon ersetzt. In diesem Fall sind es einfach die Namen von lokalen Variablen.

Code: Alles auswählen

In [98]: greeting = "Hallo"                                                     

In [99]: receiver = "Welt"                                                      

In [100]: f"{greeting}, {receiver}!"                                            
Out[100]: 'Hallo, Welt!'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten