Frage zu einem Projekt

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.
BlackJack

hubiat hat geschrieben:wie kann ich eigentlich, wenn ich mit diesem csv modul arbeite, diesem sagen, dass ich bestimmte datensätze, welche gequotet sind, dennoch richtig bearbeite?!
hab derzeit anstelle der namensausgabe eine leerzeile in meinem ausgabe file! :-/
Das Modul kann eigentlich auch mit gequoteten Einträgen umgehen. Wie sind sie denn gequotet? Kannst Du ein kleines Beispiel für solche Daten posten?
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

hab mir das nun alles nochmal angeschaut und ich bin draufgekommen, dass das mit dem csv modul zwar eine echt lässige lösung ist, aber ich das nun versuchen mag, selbst mit schleifen zu lösen!

wenn ich ein csv file dann einlese, muss ich es dann umwandeln in strings, diese dann einlesen und danach wieder zurücksetzen in den ursprünglichen zustand?! versteh ich das richtig?!
es sind einfach zu viele kriterien, welche ich erfüllen soll, um dieses beispiel/projekt zu lösen!

hätte hierfür vielleicht jemand einen lösungsansatz?!

danke schon im vorhinein!!!
BlackJack

Warum willst Du CSV Dateien selbst parsen, wenn es dafür schon ein Modul gibt, dass Dir die ganze Arbeit abnimmt? Gerade wenn Du sowieso noch eine Menge anderer Anforderungen erfüllen musst.
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

BlackJack hat geschrieben:Warum willst Du CSV Dateien selbst parsen, wenn es dafür schon ein Modul gibt, dass Dir die ganze Arbeit abnimmt? Gerade wenn Du sowieso noch eine Menge anderer Anforderungen erfüllen musst.
damit ich das mit den schleifen usw. besser verstehe! darum dachte ich mir, dass es eventuell besser wär!
wenn ich das einmal verstehe, kann ich das mit dem modul ja immer noch machen, oder?! :)
BlackJack

Grundsätzlich ja, aber das mit dem quoten willst Du nicht selbst machen, glaub mir.

Ansonsten kann man einen einfachen CSV-Leser recht schnell zusammenbasteln. Ein Dateiobjekt ist "iterable", d.h. man kann einfach in einer ``for``-Schleife darüber gehen. Es werden die einzelnen Zeilen als Zeichenketten geliefert. Das Zeilenendezeichen ist dabei noch nicht entfernt. Das kann man mit der `lstrip()` Methode machen. Und mit der `split()`-Methode kann man eine Zeichenkette an bestimmten Zeichen zerlegen. Das war's auch schon.
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

BlackJack hat geschrieben:Grundsätzlich ja, aber das mit dem quoten willst Du nicht selbst machen, glaub mir.

Ansonsten kann man einen einfachen CSV-Leser recht schnell zusammenbasteln. Ein Dateiobjekt ist "iterable", d.h. man kann einfach in einer ``for``-Schleife darüber gehen. Es werden die einzelnen Zeilen als Zeichenketten geliefert. Das Zeilenendezeichen ist dabei noch nicht entfernt. Das kann man mit der `lstrip()` Methode machen. Und mit der `split()`-Methode kann man eine Zeichenkette an bestimmten Zeichen zerlegen. Das war's auch schon.
kann man das anhand eines "einfachen" beispieles, vielleicht sogar mit meinem vorzeigen, wie ich das angehen soll?!

wär sehr dankbar dafür!
BlackJack

Also folgende Datei als Grundlage:

Code: Alles auswählen

$ cat test.csv
Max Mustermann;Mustermann;mm@muster.de;1234 56
Udo Überhacker;Überhacker;hacker@uebel.net;72554 2624
Dateien sind in Python "iterable", das heisst man bekommt mit der `iter()` Funktion einen Iterator und deshalb kann man eine Datei in einer ``for``-Schleife benutzen.

Code: Alles auswählen

In [15]: f = open('test.csv', 'r')

In [16]: it = iter(f)

In [17]: it.next()
Out[17]: 'Max Mustermann;Mustermann;mm@muster.de;1234 56\n'
In [20]: f = open('test.csv', 'r')

In [21]: for line in f:
   ....:     print repr(line)
   ....:
'Max Mustermann;Mustermann;mm@muster.de;1234 56\n'
'Udo \xc3\x9cberhacker;\xc3\x9cberhacker;hacker@uebel.net;72554 2624\n'
Mit der `rstrip()` Methode kann man das Zeilenende-Zeichen entfernen und mit `split()` die Zeichenkette zerlegen:

Code: Alles auswählen

In [26]: a = 'Max Mustermann;Mustermann;mm@muster.de;1234 56\n'

In [27]: b = a.rstrip('\n')

In [28]: b
Out[28]: 'Max Mustermann;Mustermann;mm@muster.de;1234 56'

In [29]: b.split(';')
Out[29]: ['Max Mustermann', 'Mustermann', 'mm@muster.de', '1234 56']
Jetzt musst Du nur noch das Python-Tutorial durcharbeiten.
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

hmmm...und wie mach ich das bei solchen Datensätzen zum beispiel?!

Name,Level,Type,Numerical Type,Size,Type Kind,Instance Kind,EP-Nr.,Offset,Type id,Flags
NewTypeInstance,0,Type,0,40,1,,184295,0,3,0
ENO,1,BOOL,9,1,128,2,184295,0,,0
UDINT,1,UDINT,16,4,128,8,184295,4,,0
UDINT1,1,UDINT,16,4,128,8,184295,8,,0
INT,1,INT,11,2,128,8,184295,12,,0
INT1,1,INT,11,2,128,8,184295,14,,0
ADD2,1,ADD_INT_N3,13,2,16,8,184295,16,4,0
OUT1,2,INT,11,2,128,2,184295,16,,0
ADD3,1,ADD_INT_N3,13,2,16,8,184295,18,4,0

mit dem csv modul ist es ja gegangen, dass ich nur die spalte angeben muss!
wie geht das dann mit den schleifen?!
BlackJack

Wenn Du einen `csv.DictReader` selbst schreiben möchtest, dann wird es etwas aufwändiger. Dann musst Du die erste Zeile besonders behandeln, weil da die Namen der Spalten drin stehen und für die folgenden dann jeweils ein Dictionary mit diesen Namen und dem Zeileninhalt füllen.

Fang erst einmal mit einem "normalen" Reader an, der die Zeilen als Tupel oder Listen zurückgibt.
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

BlackJack hat geschrieben:Wenn Du einen `csv.DictReader` selbst schreiben möchtest, dann wird es etwas aufwändiger. Dann musst Du die erste Zeile besonders behandeln, weil da die Namen der Spalten drin stehen und für die folgenden dann jeweils ein Dictionary mit diesen Namen und dem Zeileninhalt füllen.

Fang erst einmal mit einem "normalen" Reader an, der die Zeilen als Tupel oder Listen zurückgibt.
hmmm....okay....werd ich versuchen!
einen normalen reader....
na...ich bin gespannt...wie lang ich dafür brauchen werde! :)
Antworten