CSV-Problem

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
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 7. Juni 2006, 12:01

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.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Mittwoch 7. Juni 2006, 12:05

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
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 7. Juni 2006, 12:12

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 ??
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Mittwoch 7. Juni 2006, 12:14

du hast dieses datendurcheinander doch selbst ausgeprinted!
wieso nimmst du nicht einfach die variablen, die du nun printest?
die sollten ganz sauber sortiert sein ;)
Benutzeravatar
beewee
User
Beiträge: 35
Registriert: Mittwoch 18. Januar 2006, 22:16

Mittwoch 7. Juni 2006, 12:17

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
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 7. Juni 2006, 12:18

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Mittwoch 7. Juni 2006, 12:21

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
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 7. Juni 2006, 12:33

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 7. Juni 2006, 14:05

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 7. Juni 2006, 14:16

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 7. Juni 2006, 14:22

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 7. Juni 2006, 20:30

Thanks, that was it :D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 7. Juni 2006, 21:11

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten