Numpy Skiprow --> Skip erste 5 Zeilen in TXT File

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
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

Hallo, ich habe folgende Textdatei:

0.85; 100.0;
2516.0; 2516.0;
0.860; 0.879;
6.0; 0.8;

0.00 27.69 -0.00 20.00
0.50 28.25 0.50 20.53
1.00 28.74 1.00 20.81
1.50 29.20 1.50 20.98
2.00 29.64 2.00 21.07

und möchte nur die fett markierten Werte einlesen. Habe nun folgenden Code verwendet (mit numpy):

Code: Alles auswählen

y = np.loadtxt("test3.txt", 
               delimiter=" ", 
               skiprows=1,
               usecols=(4))
Mit skiprows=1 bekomme ich jedoch nur die erste zeile weg, kennt wer einen weg wo ich die ersten 5 Zeilen weg bekomme und tatsächlich nur die fett markierten werte einlesen kann??
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fox1203: Ernsthaft? Wenn man mit dem Wert 1 *eine* Zeile überlesen kann, hast Du keine Idee mit welchem Wert man wohl 5 Zeilen überlesen kann‽ 😲
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

na dann liegt die fehlermeldung:

Traceback (most recent call last):
File "txt_output.py", line 9, in <module>
results = np.loadtxt ("test3.txt",
File "/usr/local/lib64/python3.8/site-packages/numpy/lib/npyio.py", line 1139, in loadtxt
for x in read_data(_loadtxt_chunksize):
File "/usr/local/lib64/python3.8/site-packages/numpy/lib/npyio.py", line 1067, in read_data
items = [conv(val) for (conv, val) in zip(converters, vals)]
File "/usr/local/lib64/python3.8/site-packages/numpy/lib/npyio.py", line 1067, in <listcomp>
items = [conv(val) for (conv, val) in zip(converters, vals)]
File "/usr/local/lib64/python3.8/site-packages/numpy/lib/npyio.py", line 763, in floatconv
return float(x)
ValueError: could not convert string to float: ''

nicht daran, dass ich bereits [4] als skiprows eingegeben habe,...

eine idee an was das liegen kann??
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ja, das liegt am falschen `delimiter`. Deine Werte sind nicht durch *ein* Leerzeichen getrennt und deshalb passiert beim zerlegen dann das hier:

Code: Alles auswählen

In [230]: "     0.00       27.69       -0.00       20.00".split(" ")            
Out[230]: 
['',
 '',
 '',
 '',
 '',
 '0.00',
 '',
 '',
 '',
 '',
 '',
 '',
 '27.69',
 '',
 '',
 '',
 '',
 '',
 '',
 '-0.00',
 '',
 '',
 '',
 '',
 '',
 '',
 '20.00']
Du willst da einfach nichts angeben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

Danke, funktioniert soweit mit skiprows und usecols, ohne den Rest.

Was noch nicht ganz klappt ist, dass mir die Werte in mehreren Zeilen aufgeteilt wird, sodass es beim erneuten schreiben in ein TXT wieder nicht in einer Zeile geschrieben wird, wie kann ich das verhindern?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fox1203: Du musst es halt richtig machen. Also nicht den Fehler machen den hier keiner kennt, weil ausser Dir ja keiner weiss was Du da beim schreiben machst. 🙂
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

der code lautet:

Code: Alles auswählen

import numpy as np

results = np.loadtxt	("test3.txt",
			skiprows = 5,
			usecols = [3])

test = open ("test.txt", "w")
test.write (str(results))

print(results)
Die Daten im Test3.txt File sind untereinander angeordnet, beim Schreiben in test.txt werden diese in mehreren Zeilen aufgeteilt und haben am Anfang und am Ende ein [ bzw ]. Die eckigen Klammern müssen weg und die Daten in einer Zeile geschrieben werden.

Kannst du nun damit was anfangen, bzw. einen richtigen Weg nennen?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fox1203: Numpy hat auch Funktionen zum Schreiben von Textdateien.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

dieser abschnitt des codes wird in eine bestehenden file.write code eingefügt, sind also die messergebnisse, welche im anschluss an den zuvor geschriebenen eingabewerten in einer zeile hinzugefügt werden sollen, daher die oben beschriebene variante.

ist da eine möglichkeit die eckiegn klammern, sowie zeilenumbrüche wegzubekommen, oder siehst du da keine chanche?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fox1203: Natürlich sehe ich da eine Chance. Ich schrob ja bereits das Numpy auch zum schreiben Funktionen hat. Und genau wie bei denen zum lesen kann man da statt eines Dateinamens auch ein Dateiobjekt übergeben.

Ansonsten kann man natürlich auch selbst nicht das gesamte Objekt einfach in eine Zeichenkette umwandeln sondern die Werte einzeln umwandeln und in die Datei schreiben. Zusammen mit einem Zeilenendezeichen pro Wert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

thx, nach langem probieren hab ich zumindest geschafft, dass die werte analog zum eingelesenen txt file geschrieben werden, dh getrennt mit \n mit folgendem code:

Code: Alles auswählen

np.savetxt ("testx.txt", temp_data, fmt='%10.5f')
jetzt stellt sich noch die Frage, wie man np.savetext dazu bringt, die Werte in einer Zeile mit delimiter "," zu schreiben. mit dem befehl newline="," bekomme ich zwar ein , als trennzeichen, jedoch auch ein leerzeichen UND die zeilenumbrüche sind auch wieder da?

bitte um hilfestellung danke
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fox1203: Du willst als „delimiter“ ein Komma gibst das aber nicht als `delimiter` sondern als `newline` an‽ 😉
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

weder das eine noch das andere war die lösung;

whatever ich habe es soeben geschafft, das script läuft nun!
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

sag mal eine andere frage, da mein script ja nun eine iteration eines berechnugsmodul darstellt, wäre es interessant wie lange zB 100 iterationsläufe dauern, um ein gefühl zu bekommen wie lange 500tsd iterationen dauern werden. kennst du da eine möglichkeit, zB ein print am ende des script wie lange die laufzeit war?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei temp_data handelt es sich offensichtlich tatsächlich um Temperaturen und nicht um temptation wie ich zuerst gehofft hatte. Benutze keine Abkürzungen.
Du mußt den Zeilenvektor in einen Spaltenvektor umwandeln:

Code: Alles auswählen

np.savetxt("testx.txt", np.atleast_2d(temperatures), delimiter=",")
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Code: Alles auswählen

import time
start = time.perf_counter()
print("Sachen machen")
print(f"Laufzeit: {time.perf_counter() - start} s")
Ich weiß nicht genau, was du vor hast, aber vorsichtshalber schon mal der Tipp: Man iteriert (fast) nie über Numpy-Arrays. Wenn man das tut, macht man in der Regel etwas falsch.
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

merci, macht genau das was ich will!
Antworten