Darstellen und verarbeiten von txt-Dateien

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
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

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.
Zuletzt geändert von Anonymous am Freitag 26. September 2014, 15:21, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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

Code: Alles auswählen

[ 79.96   20.684  22.652   1.826   1.     21.809   1.501]
a fool with a tool is still a fool, www.magben.de, YouTube
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Cool, danke für deine schnelle Antwort.
Hiermit such ich am Anfang oder?

Code: Alles auswählen

s=re.findall(r'^p9.*$',text,re.MULTILINE)
Ja und jetzt das Umwandel von 1D-Arrays in 2D-Arrays :roll: 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?
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.
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

@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.
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()
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Schau ma
Lienz20013 hat geschrieben:Ja und jetzt das Umwandel von 1D-Arrays in 2D-Arrays :roll: 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()
a fool with a tool is still a fool, www.magben.de, YouTube
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

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! :wink:
Antworten