Seite 1 von 1
Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 14:52
von Lienz20013
Hi ich bin ganz neu hier und arbeite mit Python erst seit zwei Tagen. Ich muss eine txt-Datei Auswerten. Dazu habe ich sie eingelesen und nach den Zeilen die mit "p9" anfangen gesucht. Nun will ich bestimmte Spalten gegenüber darstellen :K Die ersten beiden Zeilen wurden entfernd da hie nur text stand. Hier mein code:
Code: Alles auswählen
import re
import numpy as np
import pylab as py
datei = "line1.txt"
in_file = open(datei)
text = in_file.read()
s=re.findall(r'.*p9.*$',daten,re.MULTILINE) #suchen nach p9 und die spalten danach
del s[0:2] #ersten beiden Zeilen weg wegen beschreibung
x = np.array(s)
Und hier wie x Aussieht
['p9 79.96 20.684 22.652 1.826 1 21.809 1.501'
'p9 80.96 20.665 22.681 1.781 2 21.857 1.582'
'p9 81.96 20.642 22.648 1.792 3 21.683 1.340'
'p9 82.96 20.678 22.628 1.847 4 21.695 1.351'
'p9 83.96 20.659 22.493 1.971 5 21.678 1.460'
'p9 84.96 20.696 22.503 2.004 6 21.792 1.670']
Ich würde mich über Denkanstöße freuen.
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 15:32
von BlackJack
@Lienz20013: Ich würde da ja noch mal einen Schritt zurück gehen und das filtern der Eingabedatei überdenken. Du suchst nämlich gar nicht nach Zeilen die mit 'p9' anfangen sondern nach welchen dir *irgendwo* innerhalb der Zeile die beiden Buchstaben enthalten.
Das Numpy-Array macht in der Form nicht viel Sinn. Das ist ein eindimensionales Array mit den Zeichenketten der Zeilen als Elemente, wo Du sicher ein zweidimensionales Array mit den Zahlenwerten als Zahltyp statt Zeichenkette haben möchtest.
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 15:39
von MagBen
Wenn Du in regular expression fit bist, dann bekommst Du mit numpy.fromregex (
http://docs.scipy.org/doc/numpy/referen ... .fromregex) Deine Datei in einem Einzeiler eingelesen (ich kann's aber nicht).
Ansonsten kannst Du Zeile für Zeile in 1D-Arrays umwandeln und mit diesen dann ein 2D-Array erzeugen:
Code: Alles auswählen
import numpy as np
line_0 = 'p9 79.96 20.684 22.652 1.826 1 21.809 1.501'
row_0 = np.fromstring(line_0[3:], sep=" ")
print(row_0)
Ausgabe
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 15:50
von Lienz20013
Cool, danke für deine schnelle Antwort.
Hiermit such ich am Anfang oder?
Ja und jetzt das Umwandel von 1D-Arrays in 2D-Arrays

kein Plan.
Zeile für Zeile ist schlecht, da dies nur ein Auszug ist.
Reguläre Ausdrücke lieber nicht.
Gibt es noch eine andere Möglichkeit mit einer Schleife für alle Zeilen?
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 16:07
von BlackJack
@Lienz20013: Damit suchst Du am Anfang, aber wie gesagt würde ich einen Schritt früher ansetzen, nämlich bevor die gesamte Datei in den Speicher gelesen wird. `numpy.loadtxt()` kann man zum Beispiel auch einen Iterator übergeben der Zeilen liefert. Da kann man die Zeilen vorher filtern *und* auch gleich das 'p9' am Anfang entfernen, damit nur Zahldarstellungen übrig bleiben die dann auch gleich vernünftig umgewandelt werden.
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 16:44
von Lienz20013
@BlackJack: Ja da war ich auch schon dran aber das läuft nicht
Code: Alles auswählen
in_file = np.loadtxt(datei, dtype='float', comments='"', delimiter=' ', converters=None, skiprows=0, usecols=(5,6,8), unpack=False, ndmin=0)
Noch mal zu meiner txt-Datei so sieht die im Rohzustand aus:
"Version Infos
" software : tcs.exe = 2.12.16 * 23.01.2013 : os = WinVista(6.1) : ini = C:\Users\messplatz
" Hardware : device = 16 : daq device type = 1 : com stepper = 4 : com daq = 3
d -49.56 -49.56 3.305 4.085 13.502 0.44 2088.645 20.967 -99.56 2013.920 20.079 4.99 5 1 0.0 2022.466 20.341
d -48.04 -48.04 3.305 4.101 13.551 1.96 2088.319 20.964 -98.04 2015.873 20.098 4.99
p0 277.81 20.278 20.929 -999.900 278 20.886 -999.900
p0 278.82 20.345 21.060 -999.900 279 21.006 -999.900
p0 279.81 20.567 21.044 -999.900 280 21.086 -999.900
p9 145.88 20.604 22.723 1.776 67 21.520 1.162
p9 146.93 20.571 22.679 1.786 68 21.586 1.299
p9 147.96 20.521 22.664 1.758 69 21.588 1.349
und du meinst das ich gleich von der txt nur die Zeilen mit p9 am Anfang einlese und weiter verarbeite. Und das geht dan mit 'converters' bestimmt und diesem 'lambda x' ? Oder bei 'skiprows' da kann ich nur feste Werte eingeben oder?
Aber die txt_Files sehen immer anderst aus.
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 17:00
von BlackJack
@Lienz20013: Ich meine das man vor `loadtxt()` schon a) die Zeilen filtert die mit 'p9 ' anfangen, und von denen auch diesen Präfix entfernt. Dann bekommt `loadtxt()` nur noch Zeilen mit Zahlendarstellungen zu sehen.
Code: Alles auswählen
#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
import numpy as np
def main():
prefix = 'p9 '
with open('test.txt') as lines:
p9_lines = (
line[len(prefix):] for line in lines if line.startswith(prefix)
)
data = np.loadtxt(p9_lines)
print(data)
if __name__ == '__main__':
main()
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Freitag 26. September 2014, 18:59
von MagBen
Schau ma
Lienz20013 hat geschrieben:Ja und jetzt das Umwandel von 1D-Arrays in 2D-Arrays

kein Plan.
Zeile für Zeile ist schlecht, da dies nur ein Auszug ist.
Reguläre Ausdrücke lieber nicht.
Gibt es noch eine andere Möglichkeit mit einer Schleife für alle Zeilen?
Probier das mal:
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
#Bis hierher hast Du es ja schon selbst geschafft.
s = ['p9 79.96 20.684 22.652 1.826 1 21.809 1.501',
'p9 80.96 20.665 22.681 1.781 2 21.857 1.582',
'p9 81.96 20.642 22.648 1.792 3 21.683 1.340',
'p9 82.96 20.678 22.628 1.847 4 21.695 1.351',
'p9 83.96 20.659 22.493 1.971 5 21.678 1.460',
'p9 84.96 20.696 22.503 2.004 6 21.792 1.670',]
#Numpy kann aus einer Liste ein 1D-Array erzeugen.
#Aus einer Liste von Listen oder einer Liste von 1D-Arrays
#kann Numpy ein 2D-Array erzeugen.
x = np.array([np.fromstring(line[3:], sep=" ") for line in s])
#Die Anzahl der Zeilen und Spalten des 2D-Arrays
print(x.shape)
#Zugriff auf die 2.Zeile und 6.Spalte (0 basiert):
print(x[1,5])
#Will man alle Elemente einer Zeile oder Spalte schreibt man :
#Alle Spalten der 2.Zeile
print(x[1,:])
#oder so, ein : am Ende kann weggelassen werden
print(x[1])
#Alle Zeilen der 6.Spalte:
print(x[:,5])
# plotten aller Spalten zusammen in einem Plot:
plt.figure()
for i in range(x.shape[1]):
#Die Daten der Spalten werden als Linie mit Punkten geplotet: "o-"
plt.plot(x[:,i], "o-", label="Spalte %i" % (i+1))
plt.legend() #Aus den Labels wird eine Legende gemacht.
plt.show()
Re: Darstellen und verarbeiten von txt-Dateien
Verfasst: Dienstag 30. September 2014, 13:18
von Lienz20013
Danke schön. Ein paar Sachen sind mir ein Begriff da ich vorher mit Matlab gearbeitet habe aber viele Sachen sind neu. Werde nächste Woche ersteinmal einen fünf Tägigen Kurs Besuchen...aber ich denke ich werde noch viele Fragen haben!
