Daten in Datei 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.
Antworten
Horst73
User
Beiträge: 15
Registriert: Dienstag 5. Juni 2018, 14:08

Liebe Python Community,

nachdem ihr mir bereits schon einmal hier hervorragend geholfen worden ist, würde ich euch gern nochmal etwas fragen...

Ich habe ein kleines Programm geschrieben, welches eine Datei Zeilenweise einliest. Daraus werden entsprechende Positionen ausgelesen und die Werte für einen Schleifendurchlauf gespeichert. Die Werte stehen immer an der selben Position.

Diese eingelesenen Werte sollen nun in einer neuen Datei (hier: test1.txt) zeilenweise gespeichert werden. Das bekomme ich leider noch nicht hin... Die Datei wird zwar erstellt, sie ist dann aber leer.

Ich hoffe, ihr könnt mir helfen! Würde mich riesig freuen. VIELEN Dank schon mal im voraus.

Liebe Grüße

Horst73

PS: Natürlich habe ich schon im Netz gesucht. Da gibt's viele Sachen zum Schreiben in Dateien und einlesen. Damit bin ich jetzt schon mal soweit gekommen. Aber zZ hab ich irgendwie ein Brett vorm Kopf...

Code: Alles auswählen

import string
import os
import stat

#die Datei wird erstellt

f = open('test1.txt', 'w')

with open('einzulesendeDatei.txt') as fp:
    for line in fp:
        zeile=line.rstrip()

        #Speichern der Zeilenvariable in einer neuen
        #zeile=line.rstrip()

        #Raussuchen der einzelnen Parameter - Das funktioniert hab das mit print Befehlen getestet
        day=zeile[8:10]
        month_text=zeile[4:7]
        year=zeile[20:24]
        helium=zeile[43:45]

        #neue Zeile erstellen
        neue_zeile=day, month_text, year, helium

        #Hier ist irgendwie der Wurm drinnen...
        f.write (neue_zeile)
        
f.close
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Horst73: Du bekommst ja eine Fehlermeldung, und die gibt Dir einen Hinweis darauf, was Du falsch machst. Wie lautet diese Fehlermeldung?

Das close in der letzten Zeile solltest Du auch aufrufen, oder die Datei auch im with-Statement öffnen.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vermutlich suchst du join(). Damit kannst du einen Trenner angeben, der deine Textstücke verbindet:

Code: Alles auswählen

', '.join(tag, monat, jahr)
Geht natürlich auch mit Leerzeichen, Bindestrichen, usw.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ganze mal etwas kompakter, mit einer Funktion die eine einzelne Zeile verarbeitet, die man dann auch einzeln entwickeln und testen kann:

Code: Alles auswählen

FIELD_INDICES = [(8, 10), (4, 7), (20, 24), (43, 45)]


def process_line(line):
    return ', '.join(line[i:j] for i, j in FIELD_INDICES) + '\n'


def main():
    with open('einzulesendeDatei.txt') as in_file:
        with open('test1.txt', 'w') as out_file:
            out_file.writelines(map(process_line, in_file))


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Horst73
User
Beiträge: 15
Registriert: Dienstag 5. Juni 2018, 14:08

Hallo ihr Lieben!

Wow, vielen Dank Blackjack! Das ist ja echt eine elegante Lösung, den Quellcode hab ich mir direkt mal in meine Liste mit wichtige Sachen kopiert! :) Er funktioniert auch tadellos!

In der Tat war es so, dass mein Programm keine Fehlermeldung gegeben hat. Die Datei blieb einfach nur leer...

@Blackjack: Soweit verstehe ich was dein Programm macht. Ich verstehe nur noch nicht die if Abfrage. Du hast wohl offensichtlich zwei Prozesse definiert. Der obere ist für die Prozessierung der einzelnen Zeile verantwortlich und der untere für die gesamte Datei. Wofür stehen die beiden Unterstriche in der if abfrage?
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Horst73: Ich habe Funktionen definiert. Prozesse sind etwas anderes. Das gesamte Programm läuft in *einem* Prozess ab. Davon kann man auch mehrere haben die zusammenarbeiten, zum Beispiel mit dem `multiprocessing`-Modul oder mit `concurrent.futures` wenn man dort einen `ProcessPoolExecutor` verwendet. Das kann man verwenden wenn man Aufgaben auf mehrere Prozesse verteilen möchte um beispielsweise mehrere Prozessoren/Prozessorkerne parallel mit Arbeit zu beschäftigen.

Die beiden Unterstriche gehören zu Namen. Also eigentlich sind es ja vier, zwei vorne, zwei hinten. Der Name `__name__` ist in jedem Modul an den Modulnamen gebunden. Ausser wenn man das Modul als Programm ausführt, dann ist es an die Zeichenkette '__main__' gebunden. So kann man unterscheiden ob das Modul importiert wurde oder als Programm ausgeführt wird, und entsprechend reagieren. Üblich sind die beiden Zeilen die ich dort geschrieben habe, um zu verhindern dass beim Importieren das Hauptprogramm abläuft. So kann man das als Modul in einer Python-Shell importieren und beispielsweise einzelne Funktionen testen, oder in anderen Modulen verwenden, oder automatisierte Tests schreiben. Es gibt auch einige Werkzeuge und Bibliotheken die erwarten das man Module ohne Seiteneffekte importieren kann.

Mal als Beispiel mit dem Modul aus meinem letzten Beitrag in einer Python-Shell (IPython), wobei ich das in einer Datei mit dem Namen ``test.py`` gespeichert habe:

Code: Alles auswählen

In [4]: import string

In [5]: string.ascii_letters
Out[5]: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

In [6]: len(string.ascii_letters)
Out[6]: 52

In [7]: import test

In [8]: test.process_line(string.ascii_letters)
Out[8]: 'ij, efg, uvwx, RS\n'

In [9]: test.__name__
Out[9]: 'test'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten