Import von cvs Files

28/01/2008 - 01:02 von Knappe | Report spam
Hallo!

Meine bisherige Wahl zur Auswertung von Messdaten war/ist bisher Matlab.
Im Unterschied zur Uni sind jedoch die Anzahl der verfuegbaren Lizenzen
stark begrenzt. Da die Auswertungen relativ einfach sind (und um auch was
Neues zu probieren) wollte ich mal Python (mit Scipy und Numpy)
ausprobieren. Im Moment scheitere ich jedoch schon am Einlesen der Daten.

Die Messdaten sind meistens einfache ACSII Files mit unterschiedlichen
Trennzeichen und Kommentaren.

Versucht habe ich bisher folgendes:
import csv
records = csv.reader(open("test3.txt", "rb"))
a = [record[0] for record in records]
print a

Funktioniert auch.
Ein nun folgendes
b = [record[1] for record in records]
liefert mir jedoch nicht die zweite Spalte.

Wie bekomme ich am besten die ganze Matrix geladen. Und wie kann ich
angeben, dass nur die ersten X Zeilen gelesen werden? Das Matlabfragment
sieht dafuer so aus:
temp = dlmread('test3.txt',',',[0, 0, 800, 1]);

Desweiteren wollte ich dann mal einige Operationen auf a loslassen.
b = a/1000;
TypeError: unsupported operand type(s) for /: 'list' and 'int'

Wie mache ich aus dieser List nun etwas mathematisches?

Die gefundenen Beispiele fuer csv Import behandeln meistens nur Strings:-(

Ciao , Frank.
 

Lesen sie die antworten

#1 Thomas Rachel
28/01/2008 - 08:27 | Warnen spam
Frank Knappe schrieb:

Meine bisherige Wahl zur Auswertung von Messdaten war/ist bisher Matlab.
Im Unterschied zur Uni sind jedoch die Anzahl der verfuegbaren Lizenzen
stark begrenzt. Da die Auswertungen relativ einfach sind (und um auch was
Neues zu probieren) wollte ich mal Python (mit Scipy und Numpy)
ausprobieren.



Löblich. :-)

Im Moment scheitere ich jedoch schon am Einlesen der Daten.



Schaumermal.


Versucht habe ich bisher folgendes:
import csv
records = csv.reader(open("test3.txt", "rb"))
a = [record[0] for record in records]
print a

Funktioniert auch.



Ok.


Ein nun folgendes
b = [record[1] for record in records]
liefert mir jedoch nicht die zweite Spalte.



Vorweg: Ich kenne das Modul csv nicht, erahne jedoch seine Funktionsweise.

Wie fast alle dateioperierenden Module arbeitet csv wohl direkt auf der
Datei. Das heißt, Dein records oben ist ein Iterator, der genau einmal
über die Datei wandern kann. Nachdem Du a erstellt hast, ist er durch
und Du mußt den Iterator ihn neustarten.

Das wàre natürlich blöd, da Du die Datei dann für jede interessante
Spalte nochmal durchlaufen mußt. Aber es gibt einen besseren Weg:

zuerst: abc=[record for record in records]
was sich auch als: abc=list(record)
schreiben làßt.

Damit hast Du eine Liste mit allen Zeilen der Datei, die auch noch in
ihre jeweiligen Spalten unterteilt sind. Also fast das, was Du willst.

Jetzt fehlt nur noch

a=[record[0] for record in abc]
b=[record[1] for record in abc]


Wie bekomme ich am besten die ganze Matrix geladen. Und wie kann ich
angeben, dass nur die ersten X Zeilen gelesen werden?



Dann mußt Du abc durch abc[:X] ersetzen. [1]

Desweiteren wollte ich dann mal einige Operationen auf a loslassen.
b = a/1000;
TypeError: unsupported operand type(s) for /: 'list' and 'int'

Wie mache ich aus dieser List nun etwas mathematisches?



Die einzelnen Elemente sind wohl tatsàchlich Strings, Du kannst auch -
wie die Fehlermeldung schon sagt - Listen nicht durch einen int zu
dividieren. Aber das geht über Umwege - genau wie oben elementweise:

b=[int(zahl)/1000.0 for zahl in a]


Dabei sei angemerkt, daß ein /1000 nicht unbedingt so funktionieren
würde wie gewohnt, da ein int herauskommt. Deshalb dividiere ich durch
1000.0, um einen float zu erhalten.

HTH,

Thomas

[1] Hierbei sei angemerkt, daß Python eine àhnliche ":"-Schreibweise wie
Matlab besitzt, allerdings mit einer leicht unterschiedlichen Semantik:

Bei a:b:c ist c die Schrittweite, b das erste Element, das NICHT mehr
dabei sein soll. AFAIR wàre bei MATLAB hingegen b die Schrittweite und c
das letzte Element, das dabeisein soll.

Ähnliche fragen