genfromtxt selektiv anwenden

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Speedy
User
Beiträge: 4
Registriert: Mittwoch 4. September 2019, 11:29

Dienstag 17. September 2019, 19:09

Hallo,

ich habe ein Problem beim Importieren meiner DTA files.

Die ersten 61 Zeilen sind mit Messparametern etc belegt. Anschießend kommen die Daten. Bei der Messung wurden 10 Zyklen durchgeführt, bevor die Daten des nächsten Zyklus aufgelistet werden, ist vorher z.B :"CURVE 2". Da diese Zeile weniger Spalten hat, habe ich es mit " invalid_raise=False" ignoriert. Allerdings kann ich die 2 darauffolgenden Zeilen, nicht überspringen, weil die Spaltenzahl wie bei der ersten Zeile ist. Mit der comments Funktion kann ich z.B. den ersten Input ("T") als Kommentar deklarieren, aber in der nächsten Zeile kommt dann "'s".

Das möchte ich machen, weil ich den array mit str values in einen array mit float values umwandeln möchte, das ich noch Berechnungen durchführen muss. Aber das klappt dann nicht, wenn die Zeilen "T" oder "s" enthalten.

Das funktioniert nicht:

Code: Alles auswählen

data_1 = np.genfromtxt(r"G:\xxxx.DTA",str,  delimiter = "\t", skip_header = 61, invalid_raise=False,comments=('T', 's'), usecols=(2,3,4))

Code: Alles auswählen

import itertools
with open(r"G:\03-Forschungspraktikum ISEA\DataGamry\Gamry2\110919_CV_FUO_S20_1LIPF6.DTA", 'r') as f:
    def predicate(line):
        return not line.startswith('T', 's')
    lines = (line for line in f if predicate(line))
    arr = np.genfromtxt(lines)
    
führt zur Fehlermeldung:

Code: Alles auswählen

    return not line.startswith('T', 's')

TypeError: slice indices must be integers or None or have an __index__ method
AMEWORKVERSION LABEL 7.8.1 Framework Version
INSTRUMENTVERSION LABEL 4.40 Instrument Version
COMPLIANCEVOLTAGE IQUANT 0 Compliance Voltage
CURVE1 TABLE
Pt T Vf Im Vu Sig Ach IERange Over Temp
# s V vs. Ref. A V V V # bits deg C
0 1 2,71065E+000 -1,55388E-004 0,00000E+000 2,71820E+000 1,60535E-003 11 ..........a -327,67
...
...
CURVE2 TABLE
Pt T Vf Im Vu Sig Ach IERange Over Temp
# s V vs. Ref. A V V V # bits deg C
0 1 2,71065E+000 -1,55388E-004 0,00000E+000 2,71820E+000 1,60535E-003 11 ..........a -327,67
Benutzeravatar
__blackjack__
User
Beiträge: 4192
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 17. September 2019, 19:22

Du solltest Dir noch mal anschauen was `str.startswith()` für Argumente erwartet. "s" als Startindex geht halt nicht.

Code: Alles auswählen

In [1]: "xyz".startswith("T", "s")                                              
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-814d891e690b> in <module>
----> 1 "xyz".startswith("T", "s")

TypeError: slice indices must be integers or None or have an __index__ method
“Give a man a fire and he's warm for a day, but set fire to him and he's warm for the rest of his life.”
— Terry Pratchett, Jingo
Speedy
User
Beiträge: 4
Registriert: Mittwoch 4. September 2019, 11:29

Dienstag 17. September 2019, 19:41

Du solltest Dir noch mal anschauen was `str.startswith()` für Argumente erwartet. "s" als Startindex geht halt nicht.
Oh stimmt... gibt nur wahr oder falsch an

Nachdem ich heute 10h daran verbracht habe, ist mir dann doch noch etwas eingefallen und es funktioniert :D

Code: Alles auswählen

data_1_pre = np.genfromtxt(r"G:\03-Forschungspraktikum ISEA\DataGamry\Gamry2\110919_CV_FUO_S20_1LIPF6.DTA",str,  delimiter = "\t", skip_header = 61, invalid_raise=False,comments=('T'), usecols=(2,3,4))
data_1_pre = np.char.replace(data_1_pre, ',', '.')
s_comment = np.where(data_1_pre == "s")[0]
data_1 = np.delete(data_1_pre, s_comment, 0)
data_1_float = data_1.astype(np.float)

t, Vf, Im =  data_1_float.T
Sirius3
User
Beiträge: 10548
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 18. September 2019, 04:53

Deine Datei ist halt keine CSV Datei. Die mit genfromtxt laden zu wollen, macht das nur umständlich.
Ich würde die Datei Zeilenweise parsen und mir die nötige Information in eine Liste speichern.
Antworten