Seite 1 von 1

Daten in Datei schreiben

Verfasst: Mittwoch 19. September 2018, 10:29
von Horst73
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

Re: Daten in Datei schreiben

Verfasst: Mittwoch 19. September 2018, 10:32
von Sirius3
@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.

Re: Daten in Datei schreiben

Verfasst: Mittwoch 19. September 2018, 11:06
von snafu
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.

Re: Daten in Datei schreiben

Verfasst: Mittwoch 19. September 2018, 11:38
von __blackjack__
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()

Re: Daten in Datei schreiben

Verfasst: Mittwoch 19. September 2018, 12:01
von Horst73
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?

Re: Daten in Datei schreiben

Verfasst: Mittwoch 19. September 2018, 12:21
von __blackjack__
@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'