Seite 1 von 1
CSV-Problem
Verfasst: Mittwoch 7. Juni 2006, 12:01
von pooner
Hi Leute,
versuche mich gerade daran eine csv.Datei einzulesen und diese in einem dict zu halten, so das ich auf die einzelnen Elemente anhand des dictionaries zugreifen kann. Habe mir das so gedacht da ich jeweils den header-Eintrag nehme als key, und den wert aus der spalte als name. Ich habe es jetzt soweit das ich die komplette Zeile ausgegben bekomme, aber nicht die dict. Einträge
Code: Alles auswählen
import csv
import sys
import re
import os
import copy
import exceptions
import string
from tkFileDialog import *
# FileOpenDialog
filename = askopenfilename(filetypes=[("alle Formate", "*")])
#print filename
x = 1
def get_csv(filename):
reader = csv.reader(open(filename, "r"),delimiter=";")
bezeichner = reader.next()
print bezeichner[0]
for row in reader:
print "Zeile",x
print len(row[0])
print row[0]
if row[0].startswith("#"): continue
yield dict(zip(bezeichner, row))
# print zip(bezeichner)
for i in get_csv(filename):
x=x+1
Ich weiss noch nicht mal ob das die richtige Vorgehensweise ist, vieleicht könnt ih mir ja helfen.
Verfasst: Mittwoch 7. Juni 2006, 12:05
von murph
nur von dem, was du geschrieben hast:
wieso setzt du nicht einfach die variablen in das dic?
einfach mal die ganzen variablen einfach in ein dic eintragen.
ich verstehe in dem punkt deine frage nicht
Verfasst: Mittwoch 7. Juni 2006, 12:12
von pooner
mmh, also
kriege eine Ausgabe wie folgt:
Code: Alles auswählen
ID Typ Prozessname InputName InputMenge PID
Zeile 1
9
0 0 Q1
Zeile 2
17
1 1 S1 OutP5 25 7
Ich möchte jedoch irgendwie auf jedes einzelne Element zugreifen könne, nach dem Motto line1:row1,line1:row2, usw.
Deswegen weiss ich noch nicht mal ob ein dict der richtige weg ist ??
Verfasst: Mittwoch 7. Juni 2006, 12:14
von murph
du hast dieses datendurcheinander doch selbst ausgeprinted!
wieso nimmst du nicht einfach die variablen, die du nun printest?
die sollten ganz sauber sortiert sein
Verfasst: Mittwoch 7. Juni 2006, 12:17
von beewee
Hm, ich weiß nicht, ob ich dich richtig verstanden habe, vieleicht ist das ja richtig:
Code: Alles auswählen
from tkFileDialog import *
def get_csv(filename):
f = open(filename, "r")
entries = []
for row in f.readlines():
if row.startswith("/"):
row = row.split("/")
entries.append({
'file':row[1],
'date':row[3]
})
return entries
if __name__ == "__main__":
print get_csv(askopenfilename(filetypes=[("alle Formate", "*")]))
BeeWee
Verfasst: Mittwoch 7. Juni 2006, 12:18
von pooner
steh irgendwie auf dem schlauch,
habe zwar die bezeichner und z.B. row[0], weiss aber nicht wie ich jetzt nur ein element von z.B. bezeichner oder row ansprechen kann, so in der form print line1:row1, line1:row2 usw.. Ich hoffe ich drück mich verständlich aus, Bin erst seit ner woche mit python am werkeln
Verfasst: Mittwoch 7. Juni 2006, 12:21
von murph
reader scheint eine liste zu sein, die könntest du dann eintragen.
ich weiß ja acuh nicht, was du mit dem dic willst, welche daten weiterverwendet werden sollen
Verfasst: Mittwoch 7. Juni 2006, 12:33
von pooner
ja du hast recht, ist eine liste. Jedoch wird der komplette Inhalt einer Zeile aus meiner csv zu einem Listeneintrag, also row[0], wie kann ich das splitten, das jede einzelne spalte zu einem Listeneintrag wird ??? Ich möchte dann Berechnungen vornehmen können
Danke im voraus
Re: CSV-Problem
Verfasst: Mittwoch 7. Juni 2006, 14:05
von gerold
pooner hat geschrieben:csv.Datei einzulesen und diese in einem dict zu halten, so das ich auf die einzelnen Elemente anhand des dictionaries zugreifen kann.
Hi pooner!
Hier ein Beispiel. Der Dialekt muss aber nicht so kompliziert ausgelesen werden, wenn man das Trennzeichen sicher kennt.
Code: Alles auswählen
##!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import csv
def demoquelle_erstellen(quellname):
f = file(quellname, "w")
f.writelines(
[
"Feld1;Feld2;Feld3;Feld4\n"
"a;b;c;d\n",
"0;1;2;3\n",
"4;5;6;7\n",
"8;9;10;11\n"
]
)
f.close()
def get_dictlist(quellname):
# Datei öffnen
f = file(quellname, "r")
# Struktur/Dialekt der CSV-Datei herausfinden
sn = csv.Sniffer()
dialect = sn.sniff(f.readline())
f.seek(0)
# Feldnamen stehen in der ersten Zeile
fieldnames = csv.reader(f, dialect = dialect).next()
# Auslesen und in Dictionaryliste schreiben
dictlist = []
for fields in csv.DictReader(f, fieldnames, dialect = dialect):
dictlist.append(fields)
# Datei schließen
f.close()
# Zurück geben
return dictlist
if __name__ == "__main__":
quellname = "quelle.csv"
demoquelle_erstellen(quellname)
dictlist = get_dictlist(quellname)
# Wenn möglich: Alle enthaltenen Zahlen nach Float umwandeln.
for fields in dictlist:
for key in fields.keys():
try:
fields[key] = float(fields[key])
except:
pass
print dictlist
Ergebnis:
Code: Alles auswählen
[{'Feld1': 'a', 'Feld2': 'b', 'Feld3': 'c', 'Feld4': 'd'},
{'Feld1': 0.0, 'Feld2': 1.0, 'Feld3': 2.0, 'Feld4': 3.0},
{'Feld1': 4.0, 'Feld2': 5.0, 'Feld3': 6.0, 'Feld4': 7.0},
{'Feld1': 8.0, 'Feld2': 9.0, 'Feld3': 10.0, 'Feld4': 11.0}]
mfg
Gerold
Verfasst: Mittwoch 7. Juni 2006, 14:16
von gerold
Das gleiche in grün -- als Liste:
Code: Alles auswählen
##!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import csv
def demoquelle_erstellen(quellname):
f = file(quellname, "w")
f.writelines(
[
"Feld1;Feld2;Feld3;Feld4\n"
"a;b;c;d\n",
"0;1;2;3\n",
"4;5;6;7\n",
"8;9;10;11\n"
]
)
f.close()
def get_valuelist(quellname):
# Datei öffnen
f = file(quellname, "r")
# Struktur/Dialekt der CSV-Datei herausfinden
sn = csv.Sniffer()
dialect = sn.sniff(f.readline())
f.seek(0)
# Feldnamen stehen in der ersten Zeile
fieldnames = csv.reader(f, dialect = dialect).next()
# Auslesen und in Liste schreiben
valuelist = []
for fields in csv.reader(f, dialect = dialect):
valuelist.append(fields)
# Datei schließen
f.close()
# Zurück geben
return fieldnames, valuelist
if __name__ == "__main__":
quellname = "quelle.csv"
demoquelle_erstellen(quellname)
fieldnames, valuelist = get_valuelist(quellname)
# Wenn möglich: Alle enthaltenen Zahlen nach Float umwandeln.
for row_index, row in enumerate(valuelist):
for col_index, value in enumerate(row):
try:
valuelist[row_index][col_index] = float(value)
except:
pass
print fieldnames
print valuelist
Ergebnis:
Code: Alles auswählen
['Feld1', 'Feld2', 'Feld3', 'Feld4']
[['a', 'b', 'c', 'd'], [0.0, 1.0, 2.0, 3.0],
[4.0, 5.0, 6.0, 7.0], [8.0, 9.0, 10.0, 11.0]]
mfg
Gerold
Verfasst: Mittwoch 7. Juni 2006, 14:22
von gerold
Auf die Werte einer Liste zugreifen:
Code: Alles auswählen
valuelist = [
[0.0, 1.0, 2.0, 3.0],
[4.0, 5.0, 6.0, 7.0],
[8.0, 9.0, 10.0, 11.0]
]
# Zeile 0 Spalte 2 * Zeile 2 Spalte 3
# 2 * 11
print valuelist[0][2] * valuelist[2][3] # = 22.0
mfg
Gerold
Verfasst: Mittwoch 7. Juni 2006, 20:30
von pooner
Thanks, that was it
Verfasst: Mittwoch 7. Juni 2006, 21:11
von gerold
Das freut mich.
Hier habe ich noch eine Erweiterung des Beispiels mit der Liste. In diesem Beispiel werden Leerzeilen und Zeilen, die mit einem "#" beginnen herausgefiltert.
Code: Alles auswählen
##!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import csv
def demoquelle_erstellen(quellname):
f = file(quellname, "w")
f.writelines(
[
"# Hier steht etwas Text\n",
"Feld1;Feld2;Feld3;Feld4\n",
"a;b;c;d\n",
"\n",
"#0;1;2;3\n",
"4;5;6;7\n",
"# Das ist eine Bemerkung\n",
"8;9;10;11\n",
]
)
f.close()
def get_valuelist(quellname):
# Datei öffnen
f = file(quellname, "r")
# Generator-Expression mit gültigen/gefilterten Zeilen (ab Python 2.4)
# Der Vorteil des Generators ist, dass damit auch große Dateien
# durchlaufen werden können.
filtered_lines = (
line for line in f
if not(line.startswith("#")) and
(line.strip() != "")
)
first_line = filtered_lines.next()
# Struktur/Dialekt der CSV-Datei herausfinden
sn = csv.Sniffer()
dialect = sn.sniff(first_line)
# Feldnamen stehen in der ersten Zeile
fieldnames = csv.reader((first_line,), dialect = dialect).next()
# Auslesen und in Liste schreiben
valuelist = []
for fields in csv.reader(filtered_lines, dialect = dialect):
valuelist.append(fields)
# Datei schließen
f.close()
# Zurück geben
return fieldnames, valuelist
if __name__ == "__main__":
quellname = "quelle.csv"
demoquelle_erstellen(quellname)
fieldnames, valuelist = get_valuelist(quellname)
# Wenn möglich: Alle enthaltenen Zahlen nach Float umwandeln.
for row_index, row in enumerate(valuelist):
for col_index, value in enumerate(row):
try:
valuelist[row_index][col_index] = float(value)
except:
pass
print fieldnames
print valuelist
mfg
Gerold