Seite 1 von 1

mehrere Dateien einlesen und bearbeiten

Verfasst: Mittwoch 19. Juni 2019, 09:26
von Bjarne_03
Hi, ich bin Bjarne und komme wie wahrscheinlich alle Python Anfänger mit meinem "kleinen" Programm nicht richtig voran. Deswegen hoffe ich das ihr mir weiterhelfen könnt. :)

Aber nun zu meinem Programm: Ich habe ein Gerät das verschieden Werte in eine Datei packt, aber diese stimmen noch nicht ganz und deswegen muss ich sie nachträglich manipulieren.
Es handelt sich um ein Gerät das unter Wasser arbeitet und in verschieden Wasserschichten die Daten von den einzelnen Sensoren in jeweils eine Datei speichert, so dass ich später einen folgenden Ordner mit Dateien habe:Bild

Jede Datei ist gleich aufgebaut:Bild

Und nun soll bei den letzten Beiden Werten -50 gerechnet werden und die Datei mit den neuen Werten sollte auch neu als eine andere Datei gespeichert werden. Es gibt insgesamt 13 Zeilen mit Werten (weil es 13 Geräte sind) und deswegen sind die Zeilen mit Werten am Anfang nummeriert.
Jetzt habe ich festgestellt das es doch nicht so einfach ist wie ich anfangs dacht und ich nicht genau weiß wie ich das machen soll. Ich hoffe meine Erklärung ist einigermaßen verständlich und das ihr mir weiterhelfen könnt. :roll:
So sieht übrigens mein Anfang für das Programm aus:Bild

Re: mehrere Dateien einlesen und bearbeiten

Verfasst: Mittwoch 19. Juni 2019, 09:48
von __deets__
Bitte Code und Daten so moeglich als Text posten. Dabei die [ code][ /code]-tags nicht vergessen (Space hinter der oeffnenden Klammer weglassen).

Und so ganz habe ich noch nicht verstanden, was du da tun musst/willst. Ich sehe nur 7 (relevante) Zeilen. Und auch nur Zahlen von 1-7. Fuer das einlesen diese Daten empfiehlt sich entweder das csv Modul (schon dabei) oder Pandas. In beiden Faellen musst du aber natuerlich die erste beiden Zeilen ueberspringen.

Mit pandas zB so:

Code: Alles auswählen

import pandas as pd
import io

DATA = """Pfad
Kommando
1, 2, Mar 19 2019 08:37:11, 190, 226
2, 1, Mar 19 2019 09:37:11, 226, 190"""


inf = io.StringIO(DATA) # only to emulate file!

data = pd.read_csv(inf, skiprows=2, parse_dates=[2], header=None)
print(data)

Re: mehrere Dateien einlesen und bearbeiten

Verfasst: Mittwoch 19. Juni 2019, 10:07
von Bjarne_03
OK Danke für die schnelle Antwort und sorry das nächste mal füge ich natürlich den Code ordentlich als Text ein.
In der Datei sind nur sieben Zeilen, weil auch nur sieben meiner Geräte liefen und ich meinte das es maximal 13 Zeilen gibt weil es auch nur so viele Geräte gibt.

Re: mehrere Dateien einlesen und bearbeiten

Verfasst: Mittwoch 19. Juni 2019, 10:42
von Sirius3
@Bjarne_03: zu Deinem Code:
Die isfile-Prüfung ist quatsch, da, falls die Datei nicht existiert, Dein Programm ein paar Zeilen später, wenn Du versuchst die Datei zu lesen, mit einem NameError aussteigt, weil Du das file-Objekt gar nicht erzeugt hast.
Wenn, dann versuch die Datei einfach zu öffnen, den Fehler mit except abzufangen und dann im Fehlerfall etwas sinnvolles machen. Wenn nichts sinnvolles möglich ist, dann gar nicht erst versuchen, eine Fehlerbehandlung durchzuführen.

Dateien öffnet man am besten mit dem with-Statement, dann wird die Datei implizit geschlossen, wenn sie nicht mehr gebraucht wird.
Beim Öffnen einer Datei immer ein encoding angeben, im Zweifel ASCII, wenn Du eh weißt, dass keine Umlaute vorkommen.

Wo kommst Du konkret nicht weiter?
In `line` hast Du ja jetzt die Zeilen einzeln, die Du nur nach Deinen Regeln bearbeiten mußt.

Re: mehrere Dateien einlesen und bearbeiten

Verfasst: Mittwoch 19. Juni 2019, 13:39
von kbr
@Bjarne_03: Pandas und csv bieten sich an, es geht aber auch quick and dirty. Das könnte dann z.B. so aussehen – sei filenames eine Liste existierender Dateien mit definiertem Inhalt:

Code: Alles auswählen

for filename in filenames:
    with open(filename) as f_in, open(filename+'.out', 'w') as f_out:
        for n, line in enumerate(f_in):
            if n < 2:
                f_out.write(line)
            else:
                parts = line.split(',')
                parts[-2:] = [str(int(x)-50) for x in parts[-2:]]
                f_out.write(','.join(parts) + '\n')