for line schleife ergebnisse in csv file ausgeben

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
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

Hallo,
habe mir nun einen code erstellt der sich aus csv files daten ausliest und verschiedene berechnungen anstellt, das ganze passiert in einer for line schleife
ich will jetzt die ergebnisse sammeln aneinander hängen und als csv file ausgeben
zb
year,monat,day index1,index2
habe jetzt schon mit zip und ähnlichem ru probiert aber es läuft noch nicht so richtig




für hilfestellungen immer dankbar
a

Code: Alles auswählen

import os
import csv

def calculateIndices(days):
    fmi(days,temp,hum) ## calculate humidity....
    

def fmi(days):
    for i in range(0,days):
        #output.index1[i] = 10 - 0.25* (data.temp[i] - data.hum[i])
        index1[i] = 10 -0.25*(temp[i]-hum[i])
workingdir ="E:\\Programme\\eclipse\\workspace\\learning"
hum=[]
tag= []
monat=[]        
temp=[]
prec=[]
tempmean=[]
daysofmonth=[]



index1=[]
       

for i in range( 0,366):
    monat.append(0)
    temp.append(0)
    hum.append(0)
    index1.append(0)
    
    
for i in range( 0,12):
    tempmean.append(0)
    daysofmonth.append(0)

names = os.listdir(workingdir)
try:
    outputfile =open("output_selected.csv","w")
except:
    print("daten zugriff nicht moeglich")
    sys.exit()
 
for name in names:
    fileext = os.path.splitext(name)[-1]
    if ".csv" == fileext:
         file = csv.reader(open(name),delimiter=";")
         ### create output file
         doy = 0;
         for line in file:
             if(file.line_num > 1):

                 month = int(line[2])
                 day = int(line[3])
                 
                 if month==1 and day==1:
                    year = int(line[1])
                    doy=0
                    for i in range(0,12):
                        tempmean[i]=0
                        daysofmonth[i]=0
                        
                 if month==2 and day==29:
                    continue
                 
                 monat[doy]=month
                 temp[doy]=float(line[4])
                 hum[doy]=float(line[6])
                 tempmean[month-1]+=temp[doy]
                 daysofmonth[month-1]+=1

                 doy = doy + 1
                 
                 if month==12 and day==31:
                    for i in range(0,12):
                        tempmean[i]=tempmean[i] / daysofmonth[i]
                    # calc indices
                    fmi(doy)
                  
                    print(year)
                    print (monat)
                    print(temp)   
                    print(tempmean)   
                    print(daysofmonth)  
                    print(index1)
                     
                    
                     #writeOutputs()

         ### file finished
         print ("file finished")        
der späte wurm ...
The Spirit
User
Beiträge: 276
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

wenn ich das richtige verstehe willst du die print parameter am ende nicht printen sonder an "outputfile" übergeben. ist das so richtig?
und für jeden durchlauf soll eine neue zeile angelegt werden, oder?
wenn ja,
einfach

Code: Alles auswählen

outputfile.write("parameter1", "parameter2", ...)
und zum schluss noch

Code: Alles auswählen

outputfile.close()
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

@spirit
das mit dem print ist nur zu meiner kontrolle das auch was passiert
typisches anfänger debugging halt
richtig ist die parameter sollen an ein outputfile übergeben werden
mit deiner methode bekomme ich allerdings einen fehler:

Traceback (most recent call last):
File "E:\Programme\eclipse\workspace\klima\src\files_play.py", line 120, in <module>
d.write("year","month","day")
TypeError: write() takes exactly 1 argument (3 given)

würdest du die funktion noch innerhalb der for line schleife setzen oder ausserhalb?
ich ahebe sie jetzt ausserhalb gesetzt weil ich ja nur einen file will..
thx a
der späte wurm ...
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hallo,

dein Code ist verbesserungsfähig. Ich hab mir deinen Code nur grob durchgeschaut, die Verwendung von den ganzen Listen kann man vermeiden. Werden die Daten nach der Verarbeitung noch benötigt?
Wenn nein, dann tätt ich in Variablen dafür in einer Funktion dafür anlegen und in diesen die Ergebnisse von deinen Berechnungen speichern statt in einer Liste.

ein paar Verbesserungsvorschläge:

-Lass den Code von der Modulebene verschwinden und pack ihn in Funktionen

-Ein Python Datei kannst du ausführbar machen mit einem:

Code: Alles auswählen

if __name__ == '__main__':
#hier die Hautfunktion aufrufen
    main()
-Beim Exceptiohandling fange nie alle möglichen Exceptions ab,
verwende folgendes in deinem Fall:

Code: Alles auswählen


try:
    outputfile = open("output_selected.csv","w")
except IOError:
    print("daten zugriff nicht moeglich")
    sys.exit(0) 
-Verwende keine globalen Variablen
-Namensgebung(PEP8)

Grüße
Martin
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

martin101986 hat geschrieben: -Ein Python Datei kannst du ausführbar machen mit einem:

Code: Alles auswählen

if __name__ == '__main__':
#hier die Hautfunktion aufrufen
    main()
Nee, damit macht man die Datei nicht ausführbar, sondern trennt zwischen Ausführung des Moduls und dem import durch ein anderes!
Ob ein Script ausführbar ist, ist Sache des Rechtemanagements des verwendeten OS.
Natürlich hast Du Recht damit, dass er diesen Hook einbauen sollte in seinen Code.
martin101986 hat geschrieben: ...verwende folgendes in deinem Fall:

Code: Alles auswählen

try:
    outputfile = open("output_selected.csv","w")
except IOError:
    print("daten zugriff nicht moeglich")
    sys.exit(0) 
Du hast das with vergessen! Damit spart man sich den expliziten Aufruf von close() (den Du auch nicht im finally-Zweig gezeigt hast :-D )

Code: Alles auswählen

try:
    with open(...) as out_file:
        # z.B.
        out_file.write()
except IOError, e:
    print e
Ansonsten natürlich Zustimmung. Das ganze ist ziemlich unstrukturiert so wie es oben steht. Da findet niemand fremdes durch und motiviert auch nicht dazu, sich das genauer anzusehen!
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

@martin und hyperion
erstmal danke für eure kommentare;
klar ist der code unstrukturiert, wenn ich es wirklich besser könnte würde ich es besser machen aber ich möchte kurz darauf hinweisen das es auch anfänger und profis gibt . ich arbeite jetzt seit drei wochen mit python ...
ohne grossartige programmierkenntnisse eure tipps sind bestimmt wichtig aber helfen mir nicht direkt weiter..


mit der write funktion und + "parameter" habe ich den oben stehenden fehler gelöst allerdings habe ich nachwievor immer alle jahres werte in einer liste stehen
also ungefähr so
[liyear];[limonat];ect.
der späte wurm ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ali2go hat geschrieben: klar ist der code unstrukturiert,
Wenn Du das schon selber erkennst, dann sollte Dir selber klar sein, dass Du das ändern musst, bevor Du weiterarbeitest.
wenn ich es wirklich besser könnte würde ich es besser machen aber ich möchte kurz darauf hinweisen das es auch anfänger und profis gibt . ich arbeite jetzt seit drei wochen mit python ...
ohne grossartige programmierkenntnisse eure tipps sind bestimmt wichtig aber helfen mir nicht direkt weiter..
Ein wenig mehr Zeichensetzung wäre schön (und Groß- / Kleinschreibung hilft beim Lesen auch ungemein!).
Na klar ist es als Anfänger "hart", da man viele Fehler macht - vor allem eben auf konzeptueller Ebene, bei der kein Interpreter meckert ;-) Aber Du solltest eben versuchen Dich darin zu verbessern.

Beispiel: Du nutzt selber Funktionen, "weigerst" Dich aber dieses Konzept für jeden Teil Deines Codes umzusetzen. Das passt doch nicht zusammen! Code auf Modulebene ist in den seltensten Fällen sinnvoll.
Generell hilft das Strukturieren in Funktionen aber auch, um die gesamte Funktionalität des Tools besser zu überblicken! Fragen wie "Was soll mein Script tun? Welche Datenstrukturen brauche ich? Woher kommen die Input-Daten? Was will ich mit denen damit machen? Wann schreibe ich diese zurück? Schreibe ich diese immer zurück?" uvm. helfen da weiter.

Beispiel:

Code: Alles auswählen

hum=[]
tag= []
monat=[]       
temp=[]
prec=[]
tempmean=[]
daysofmonth=[]
Erkläre doch mal, wieso Du genau diese Struktur für Deine Werte gewählt hast! Dazu kannst Du ja mal z.B. eine Zeile Deiner Werte-Dateien hier posten und anhand dieser eklären, was wo rein abgebildet werden soll und wie die einzelnen Werte ggf. zueinander in Beziehung stehen.
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hyperion hat geschrieben:
martin101986 hat geschrieben: -Ein Python Datei kannst du ausführbar machen mit einem:

Code: Alles auswählen

if __name__ == '__main__':
#hier die Hautfunktion aufrufen
    main()
Nee, damit macht man die Datei nicht ausführbar, sondern trennt zwischen Ausführung des Moduls und dem import durch ein anderes!
Ob ein Script ausführbar ist, ist Sache des Rechtemanagements des verwendeten OS.
Natürlich hast Du Recht damit, dass er diesen Hook einbauen sollte in seinen Code.
Da hab ich falsch ausgedrückt, ich hab eigentlich eh das selbe gemeint wie du. Das nächste mal pass ich besser auf.
Hyperion hat geschrieben:
martin101986 hat geschrieben: ...verwende folgendes in deinem Fall:

Code: Alles auswählen

try:
    outputfile = open("output_selected.csv","w")
except IOError:
    print("daten zugriff nicht moeglich")
    sys.exit(0) 
Du hast das with vergessen! Damit spart man sich den expliziten Aufruf von close() (den Du auch nicht im finally-Zweig gezeigt hast :-D )

Code: Alles auswählen

try:
    with open(...) as out_file:
        # z.B.
        out_file.write()
except IOError, e:
    print e
Dort wollte ich rein nur auf das Abfangen von Exceptions eingehen, darum hab ich das Schließen der Datei nicht beachtet. Hätte zwecks der Vollständigkeit dazugehört.
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

@hyperion

ok, ich werde mal versuchen meine Herangehensweise zu verdeutlichen
ich habe eine csv datei aus der ich mir werte auslese
id year monat tag temp rain hum
5901 1982 11 26 6.2 0 85
diese werte brauch ich teilweise für meine berechnungen
ich erstelle listen die ich dann durchlaufen kann

Code: Alles auswählen

hum=[]
tag= []
monat=[]        
temp=[]
prec=[]
tempmean=[]
daysofmonth=[]
da es sich um 365 tage pro jahr handelt hat jede liste 365 einträge
beim ersten versuch bekam ich eine out of index fehler deshalp habe ich dann die

Code: Alles auswählen

for i in range( 0,366):
    monat.append(0)
    temp.append(0)
    hum.append(0)
    fmiwert.append(0)
schleife eingebaut damit hats funktioniert
das selbe gilt für anzahl der tage pro monat und die temperatur mittelwerte
ich durchlaufe dann mit hilfe des zählers doy meinejahr in der csv datei und wende bestimmte bedingungen an
linenum>1
month==12 and day ==31 (ende des jahres)

dann rufe ich die funktionen auf. diese füllen dann die jeweilige liste (index 1, index2)

jetzt ergeben sich für mich zwei probleme:
ich bekomme die funktionen nich in ein externes modul. ich scheitere wohl daran dass ich nicht weiss wie ich die parameter und den zähler übergeben bekomme..

davon abgesehen gibt es noch das problem beim outputfile
mit der print ausgabe kann ich in der for line schleife für jedes Jahr die werte als liste ausgeben lassen
allerdings brauch ich sie in einem csv file der ungefähr so ausehen sollte
year monat day index1 index2
1961 1 1 32.05 67.9

das heisst das er nach jedem for line durchgang eine neue row an den csv file schreibt mit diesen werten...?

wie gesagt ich möchte mich gerne verbessern, lerne mit Buch und Netz aber das zusammenbauen von verschieden programm Teilen in ein Ganzes finde ich noch ziemlich schwierig
meine kenntnisse sind noch aus nem VB grundkurs der uni ..

nach wie vor für jeden hinweis dankbar
der späte wurm ...
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Für die Berechnung der Tage würde ich dringend das dateteime-Modul empfehlen. Damit du keinen 31. Februar bekommst, solltest du so etwas benutzen:

Code: Alles auswählen

d = datetime.date(year, 1, 1) + datetime.timedelta(day_of_year - 1)
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

kurzes update:
mein output file
sieht jetzt erstmal ok aus.
habe alle listen mit der zip () und einem writerow in ein file schreiben können

Code: Alles auswählen

kombi=zip(jahr,monat,tag,fmiwert)
for element in kombi:
       writer.writerow(element)

allerdings gibt er mir den file mit einer leeren zeile aus, meine Recherche sagt system abhängig liegt das am "w" oder "wb" in der open ausgabe des writer objektes. Allerdings gibt mir python folgenden Fehler aus wenn ich "wb" statt "w" einsetze..

writer=csv.writer(open("test.csv", 'wb'),delimiter=";")

->Traceback (most recent call last):
File "E:\Programme\eclipse\workspace\klima\src\files_play.py", line 97, in <module>
writer.writerow(element)
TypeError: must be bytes or buffer, not str

jemand einen tipp?

an das strukturieren der funktionen gehts morgen..

a
der späte wurm ...
Antworten