Datei auslesen und in neue Datei übertragen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Hallo Liebe Leute,

ich bin neu hier und Python-Anfänger. Im Rahmen meiner Masterarbeit soll ich aus mehreren Dateien (Dateiendung .out, bzw .arc) bestimmte Daten auslesen und in ein neues File schreiben.

Ist es dabei möglich ein Skript zu schreiben, bei dem man zunächst eine Datei geöffnet ,dann vorzugeben in welcher Zeile und Spalte sich der gewünschte Wert befindet und diesen direkt in das Neue File zu übertragen?

Mit freundlichen Grüßen

MRO5494
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Dateiendung .out oder .arc sagt nicht wirklich etwas darueber aus, WAS das ist. Du wirst da also noch ein bisschen weiter ausholen muessen um zu beschreiben, was genau das fuer Formate sind. Dann kann man auch Hinweise dazu geben, *wie* sich das loesen laesst. Allgemein kann man natuerlich sowas programmieren, wenn man ein Format hat, das Daten irgendwie in Tabellenform vorhaelt, und diese Dateien lesen und schreiben kann.
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Sagen wir ich habe folgenden Aufbau:

1 x y z
2 Drehzahl 1 1 1
3 Lambda 1 2 1
4 Hubraum 1 1 1

Nun möchte ich ein Skript haben, dass sagt lese mir Zeile 3 den Wert für Lambda in Spalte y aus und schreibe es in eine neue Datei "Auswertung.txt" oder Ähnliches.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Grundsätzlich geht das. Allerdings musst du die Datei schon selbst interpretieren.
Du kannst die Datei Zeile für Zeile durchgehen, den Inhalt nach Leerzeichen trennen (split) und so an die entsprechenden "Spalten" kommen.
Wo genau die Schwierigkeiten liegen, kommt dann auf den tatsächlichen Fall an. Können zum Beispiel mehrere Zeilen mit "Drehzahl" vorkommen und wie unterscheidet man die Zugehörigkeit, etc.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann benutzt du das csv-Modul um die Daten einzulesen und das entsprechende Element rauszuloesen. Das kannst du dann wieder mit dem csv-Modul schreiben.

Code: Alles auswählen

import io
import csv

DATA = """1 x y z
2 Drehzahl 1 1 1
3 Lambda 1 2 1
4 Hubraum 1 1 1"""

ROW, COL = 2, 1


def main():
    with io.StringIO(DATA) as inf:
        reader = csv.reader(inf, delimiter=" ")
        value = list(reader)[ROW][COL]
        print(value)

if __name__ == '__main__':
    main()
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Okay, Vielen Dank Ihr 2!
Da ich noch am Anfang mit Python bin, verstehe ich noch nicht so viel davon. Könnt ihr mir empfehlen, nach was ich da googeln soll. Ich habe auch schon oft vom dem package Numpy gelesen. Geht das in die richtige Richtung?

Mit freundlichen Grüßen
MRO5494
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, das Paket numpy bezieht sich auf numerische Matrizen. Eine Alternative zu csv das ich verwandt habe ist das Pandas-Modul, das kannst/solltest du dir anschauen. Ich bin allerdings etwas verwirrt, ob das was du da als Format angegeben hast jetzt etwas ist, das du dir selbst ausgedacht hast. Oder ist das wirklich das verwandte Format? Die Formulierung "Sagen wir ich habe folgenden Aufbau" suggeriert das ist was selbst ausgedachtes.
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Ich habe die Datei mal als Bild abgebildet wie sie aussieht.

Bild
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Bild
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ok, das sieht ja schon ziemlich so aus wie vorher angegeben. Dafuer wuerde ich pandas benutzen.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Wenn ich die Daten richtig interpretiere hast du 3 Dimensionen:
  • Messzyklus 0 bis n
  • Zylinder 1 bis 4
  • jeweils Messwerte für rpm, bore, stroke, conn_rod, cyl_disp, ...
Das ist in Pandas machbar, aber nicht sonderlich gut. Dafür gibt es aber xarray. Die Idee basiert auf Numpy und Pandas. Ist weitestgehend konvertierbar zu Pandas DataFrames. Auf jeden Fall einen Blick wert.
Da der Input sehr strukturiert ist, kann als Quick'n'dirty-Methode auch einfach die Datei stumpf mit den Standardfunktionen eingelesen und dann aussortiert und umgespeichert werden. Das ist jedoch nicht der schöne und korrekte Weg.
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Hallo Leute,

Ich habe mich jetzt ein wenig eingearbeitet und arbeite aktuell mit pandas. Nun möchte ich Daten in eine csv-Datei schreiben. Aber leider klappt es nicht wie ich möchte.

Mein Code sieht wie folgt aus:
IP = pd.read_csv(file_path, header=2, delim_whitespace=True, low_memory=False)
print (IP['sp_ip_01'][2])
result = IP['sp_ip_01'][2]
result.to_csv ('IP.csv')

Jetzt bekomme ich folgenden Fehler: AttributeError: 'str' object has no attribute 'to_csv'

Was kann ich tun? Die packages pandas und csv sind importiert.

Vielen Dank im Voraus!

Euer MRO
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

"result" ist vom Typ "str", also eine Zeichenkette. Und die hat keine Funktion "to_csv" - das bedeutet der Fehler.
Wie kommst du darauf, dass die eine haben sollte?
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Ich weiß nicht wie ich darauf komme, sry. Ich habe das Problem nun mit dem csv-writer gelöst.

Vielen Dank!
Antworten