mehrere Dateien einlesen und bearbeiten

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
Bjarne_03
User
Beiträge: 2
Registriert: Mittwoch 19. Juni 2019, 08:45

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
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)
Bjarne_03
User
Beiträge: 2
Registriert: Mittwoch 19. Juni 2019, 08:45

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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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')
Antworten