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.
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

pr0stAta hat geschrieben:Ich gebe zu ich habe mir den Teil davor nun nicht
durchgelesen aber ich würde dir schonmal empfehlen,
den Aufruf ohne ">" zu machen. Also eher so:

fileanalyse.py Test.csv fileanalyse.txt
In der Datei fileanalyse.py kannst du mit sys.argv[1] und sys.argv[2]
auf die 2 Parameter zugreifen, die du übergeben hast.

Code: Alles auswählen

import sys

print sys.argv[1]
print sys.argv[2]
*wie vorher auch schon erklärt*

Ergibt:

Code: Alles auswählen

C:\Dokumente und Einstellungen\lokal\Desktop>fileanalyse.py Test.csv fileanalyse.txt
Test.csv
fileanalyse.txt
okay...danke für den tipp!
hmm...und wie sieht da die handhabung dafür aus?!
wie greif ich auf die 2 parameter zu, welche ich übergeben hab?!
bei mir scheitert es glaub ich grundsätzlich an dem, dass ich die hilfe/erklärung zu dem sys.argv nicht verstanden hab! :-/
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Oder wenn du es mit der Ausgabeumlenkung ">" machen willst: Dann nimmt dein Programm nur die Eingabedatei als Argument, und dein Programm gibt die Ausgaben, die du in einer Datei speichern moechtest, direkt auf dem Bildschirm aus.

Beispiel: Speichere folgendes Programm als argument.py:

Code: Alles auswählen

#!/usr/bin/env python

import sys;
print "Erstes Argument:", sys.argv[1];
Nun kann man in der Schell folgendes machen:
rbreu@zam285:python> ./argument.py eine_datai.txt
Erstes Argument: eine_datai.txt
rbreu@zam285:python>
(Ausgabe erscheint auf dem Bildschirm). Oder auch:
rbreu@zam285:python> ./argument.py eine_datai.txt > bla.txt
rbreu@zam285:python>
rbreu@zam285:python> more bla.txt
Erstes Argument: eine_datai.txt
(keine Ausgabe auf dem Bildschirm, die Shell lenkt die Ausgabe in die Datei bla.txt um)
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

wie greif ich auf die 2 parameter zu, welche ich übergeben hab?!
He? :p Das hab ich doch gerade geschrieben.

Also nochmal:
Wie Rebecca schon sagte, sys.argv ist eine Liste. Die enthält als
Listeneinträge jene Werte, die du dem Programm übergibst.
Also wenn du schreibst:

Code: Alles auswählen

fileanalyse.py Test.csv fileanalyse.txt
Sieht sys.argv im pythoncode so aus:

Code: Alles auswählen

sys.argv = ["c:/ordner/fileanalyse.py", "Test.csv", "fileanalyse.txt"]
Nun kannst du dir aussuchen, ob du über die Liste iterierst(wie bei Rebeccas Beispiel ganz oben) oder die ELemente der Liste einzeln ansprichst (so wie ich es gemacht habe)

Hilft das weiter? Wenn nein, sag was genau du nicht versteht :>

Gruss prosta
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

ich steh heut einfach auf der leitung! :-/
also....
...wie es in meinem konkreten beispiel ist bring ich einfach keine lösung zusammen! keine ahnung warum!

hab das mit dem argument von rebecca versucht, aber leider erhalte ich dann folgende meldung:

./argument.py RTNames.csv
Traceback ( File "<interactive input>", line 1
./argument.py RTNames.csv
^
SyntaxError: invalid syntax

was versteh ich da falsch?!
schön langsam schäm ich mich für mein unlogisches denken heute! :-/
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

./argument.py RTNames.csv

Diese Zeile sollst du auch nicht in den Python-Interpreter eintippen, sondern in die Shell (command, Eingabeaufforderung oder wie auch immer es genannt wird, je nach dem ob's Linux oder Windows ist).
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

Rebecca hat geschrieben:
./argument.py RTNames.csv

Diese Zeile sollst du auch nicht in den Python-Interpreter eintippen, sondern in die Shell (command, Eingabeaufforderung oder wie auch immer es genannt wird, je nach dem ob's Linux oder Windows ist).
okay...das hab ich nun mal verstanden!

jetzt hab ich die fix eingetragene RTNames.csv im Sourcecode, ersetzt durch sys.argv[1], ist das korrekt?!
muss ich da was besonderes beachten?!
weil ich erhalte nun folgende meldung!

D:\Bildung\python\jhtest>bbb.py RTNames.csv
Traceback (most recent call last):
File "D:\Bildung\python\jhtest\bbb.py", line 9, in ?
f = file("sys.argv[1]")
IOError: [Errno 2] No such file or directory: 'sys.argv[1]'

also irgendwas mach ich dank meiner unwissenheit falsch! :)
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Mach mal aus:
f = file("sys.argv[1]")

Code: Alles auswählen

f = file(sys.argv[1], "r")
Bei dir ist sys.argv[1] ein String. Eigentlich ist es aber ein Listenelement.
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

pr0stAta hat geschrieben:Mach mal aus:
f = file("sys.argv[1]")

Code: Alles auswählen

f = file(sys.argv[1], "r")
Bei dir ist sys.argv[1] ein String. Eigentlich ist es aber ein Listenelement.
hab ich gemacht!
nun erhalt ich folgende meldung:

raceback (most recent call last):
File "C:\Apps\Python\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
exec codeObject in __main__.__dict__
File "D:\Bildung\python\jhtest\bbb.py", line 9, in ?
f = file(sys.argv[1], "r")
IndexError: list index out of range
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Du solltest dir die Fehlermeldungen schon einmal selber
durchlesen und überlegen was sie bedeuten können, wie willst
du sonst die Sprache wirklich lernen? :) Gerade diese
ist doch wirklich Aussagekräftig.

Das bedeutet, das es keinen Eintrag an der Stelle 1 in der Liste
gibt.
*Vermutung*
Du hast deine Datei nicht mit einem Parameter aufgerufen,
also deiner CSV Datei. Übergib deinem Aufruf deines Scriptes noch
den Namen deiner CSV Datei die hoffentlich im selber Ordner
deines Scriptes liegt.
hubiat
User
Beiträge: 20
Registriert: Donnerstag 22. Juni 2006, 09:23

pr0stAta hat geschrieben:Du solltest dir die Fehlermeldungen schon einmal selber
durchlesen und überlegen was sie bedeuten können, wie willst
du sonst die Sprache wirklich lernen? :) Gerade diese
ist doch wirklich Aussagekräftig.

Das bedeutet, das es keinen Eintrag an der Stelle 1 in der Liste
gibt.
*Vermutung*
Du hast deine Datei nicht mit einem Parameter aufgerufen,
also deiner CSV Datei. Übergib deinem Aufruf deines Scriptes noch
den Namen deiner CSV Datei die hoffentlich im selber Ordner
deines Scriptes liegt.
danke super! ich affe hab das im python gesstartet! *tz*
in der commandline hats funktioniert! :)
DANKE für DEINE Hilfe! Hast mir viiiel weitergeholfen!!!!

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! :-/
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