Daten von .dat mit Python einlesen

n_e_r_d

Cadet 4th Year
Registriert
Dez. 2021
Beiträge
97
Guten Tag,

ich habe Dateien in der Form wie "Datei1.dat" vorliegen:

Code:
! Header-Teil
!
! Sweep3D 0.1 BETA                         
! Sweepmodus:      Magnet
! Sweepstart:      0.000000
! Sweeprate:       -0.008000
! Sweepstop:       0.013815
! Interval:        1.000000
!
! Startkonfiguration:
!   B_R;          B_THETA;      B_PHI;        B_X;          B_Y;          B_Z;          Spannung;     Gate;         Temp;
!   0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00;
! Endkonfiguration:
!   B_R;          B_THETA;      B_PHI;        B_X;          B_Y;          B_Z;          Spannung;     Gate;         Temp;
!   6.277500e-03; 0.000000e+00; 0.000000e+00; 6.277500e-03; 0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00; 0.000000e+00;
!
!
! Daten-Teil
!
B_R    L0_0    L2_0   
0.000000e+00    5.782878e-07    -1.210548e-08     
0.000000e+00    6.396511e-07    1.960998e-08     
8.325000e-04    6.920220e-07    2.225765e-09     
0.000000e+00    8.208139e-07    -1.510335e-09     
0.000000e+00    8.028422e-07    -1.865466e-08

Ich möchte die Daten aber erst ab der Zeile einlesen, ab der auch wirklich die Werte beginne, also hier ab Zeile 21. Wie mache ich das bei folgendem Python-Programm:

Code:
import csv
import math
import matplotlib.pyplot as plt
from pathlib import Path

B = []
UL = []
UH = []


#Pfad in dem sich die zu plottende Datei (Textdatei, csv, dat, ...) befindet
pfad = "PFAD/"


#Um Daten aus .csv / .text / .dat einzulesen (Die in Spalten eingetragen sind)
with open(pfad + "Datei1", "r") as handle:
    reader = csv.reader(
        handle,
        delimiter = '\t'
    )
    print(reader)
    first = next(reader) #was macht das genau?
    for row in reader:
        print(row)
        B.append(float(row[0]))
        UL.append(float(row[1]))
        UH.append(float(row[2])) #Das -1 dient zum Spiegeln des Graphen

Danke im Voraus und beste Grüße

n_e_r_d
 
überspring einfach die zeilen, die mit "!" beginnen:
Python:
import csv


with open("1.csv") as f:
    while f.readline().startswith("!"):
        continue

    reader = csv.reader(f, delimiter='\t')

    for row in reader:
        print(row)

ergibt dann
Code:
$ python 1.py
['0.000000e+00', '5.782878e-07', '-1.210548e-08']
['0.000000e+00', '6.396511e-07', '1.960998e-08']
['8.325000e-04', '6.920220e-07', '2.225765e-09']
['0.000000e+00', '8.208139e-07', '-1.510335e-09']
['0.000000e+00', '8.028422e-07', '-1.865466e-08']

edit: noch eine zeile eingespart :)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: n_e_r_d, RalphS und madmax2010
Ist zwar schon gelöst, aber wenn es wirklich um regelmäßig formatierte Daten geht, kann man das gleich mit numpy erledigen:

Python:
import matplotlib.pyplot as plt
import numpy as np

dn, fn = '.', 'Datei1.dat'
path = dn + '/' + fn

A  = np.loadtxt(path, skiprows=20)
B  = A[:,0]
UL = A[:,1]
UH = A[:,2]

plt.scatter(UL, UH)
plt.show()

1644668215666.png
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: n_e_r_d
Danke, das mit numpy gefällt mir auch. Ich bleibe aber vorerst mal bei der ersten Variante.

Ich habe aber noch ein zweites Problem:
Ich erstelle damit dann Diagramme und ich habe viele verschiedene .dat Dateien. Also muss ich für jede .dat Dateien Änderungen vornehmen (z. B. x-Achsenbereich anpassen, ...).

Ich hätte es gern so, dass mir Python für jede .dat Datei auch eine separate Textdatei .txt mit dem aktuellen Python-Code erstellet. Ich hab es bis jetzt so:

Code:
titel = 'Messung 1'

#Da für jede einzelne Graphik verschiedene Parameter im Python-Code angepasst werden müssen, wird das jeweilige Python-Programm als Textdatei mit abgespeichert:
file = open("C:/PFAD" + titel + ".txt", "w+") #Durch das w(rite) kann in die .txt Datei geschrieben werden; Durch das + wird eine .txt Datei mit dem Dateinamen (titel) erstellt

file.write("Hallo")

Wie aber kann ich anstatt dem "Hallo" das aktuelle Python Programm (Also Zeile ... bis Zeile ...) einfügen?
 
das hört sich nicht nach dem richtigen ansatz an. übergib dem script einfach die parameter, die du für die anpassungen brauchst.
 
  • Gefällt mir
Reaktionen: n_e_r_d
Das ist unverständlich. Was genau mußt Du genau wofür anpassen und warum? Ein vollständiges Beispiel würde zum Verständnis beitragen ...
 
Ich bin gerade dabei, es so zu machen, wie @0x8100 gemeint hat.

Das ist wohl wirklich die beste und effektivste Möglichkeit.
 
Ok also ich habe die meisten Dinge übergeben.

Aber es gibt einfach Dinge, die ich wirklich selber manuell für jeden Graphen einstellen würde (Sind spezielle Graphen aus der Physik. Würde hier wahrscheinlich zu weit führen).

Also stellt sich mir immer noch diese Frage:
n_e_r_d schrieb:
Wie aber kann ich anstatt dem "Hallo" das aktuelle Python Programm (Also Zeile ... bis Zeile ...) einfügen?

Viele Grüße

n_e_r_d
 
n_e_r_d schrieb:
Mir ist nicht klar, wie ich damit den aktuell durchlaufenen Python-Code direkt speichern kann.
Du schrobst weiter oben:
Aber es gibt einfach Dinge, die ich wirklich selber manuell für jeden Graphen einstellen würde
Du willst also nicht "das Python-Skript" abspeichern sondern die unterschiedliche Parametrisierungen für die Graphen - bezogen je auf den konkreten Datensatz.

Und genau das erlaubt pickle im obigen Beispiel.

Du liest einen Datensatz "meinedaten1.dat" ein. Jetzt schaust Du im (einen) Python-Skript, ob es bereits eine Datei "meinedaten1.pickle" gibt. Wenn ja, dann ebenfalls einlesen (und damit wieder den spezifischen Status des Plots herstellen). Jetzt kannst Du am konkreten Plot weiter herumfuhrwerken bis er Dir gefällt. Am Ende des (einen) Python-Skripts speicherst Du den Status als "meinedaten1.pickle" wieder ab, so dass es beim nächsten mal für diesen Datensatz "meinedaten1.dat" erneut geladen werden kann.
 
Zurück
Oben