csv - Arbeit if abs(float(row[1])) <= abs(float(row[2]))

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
mgolbs
User
Beiträge: 28
Registriert: Freitag 3. Februar 2012, 13:07

Hallo,

ich bin noch ein ziemlicher Anfänger in Python. An einem csv Problem versuche ich den Einstieg. Einiges klappt schon ganz gut. :) Leider bekomme ich zu dem Fehler " if abs(float(row[1])) <= abs(float(row[2])) ^ SyntaxError: invalid syntax" keine Lösung, weder Forumsuche noch Suchmaschinen. Die unter row[1] und row[2] stehenden Werte in der Datei sind real. Ich nutze das Skript schon in abgewandelter Form zur Verrechnung. Da läuft es.

Was ist daran grundsätzlich falsch?
if abs(float(row[1])) <= abs(float(row[2]))


Hier mein Code:

Code: Alles auswählen

import csv
import sys
rowret = []
filefem = open('2012-02-03.csv','r')  
csvreader=csv.reader(filefem, delimiter=',')  
idbewert= []; Haupt1= []; Haupt2= []; AGK= []; Pro_Ab = [];
i = int(0) 
ii = int(0)
n = int(0)
ergebnisverrechnung = open('2012-02-03-Re.csv', 'wt')
writer = csv.writer(ergebnisverrechnung, delimiter=',')
for row in csvreader:  
	if len(row) == 1:
		ii = int(ii+1)
		if ii > 1:
			ii = 0
			n = (n+1)
			rowret = ["%s loadcase x" % n,"x-AGK"]
			writer.writerow(rowret)
			rowret = ["ID","Haupt_1","Haupt_2"]
			writer.writerow(rowret)
			i = int(i+1)
			print "%ster Lastfall: " % i
			while True:
				try:
       					Prozent_Fehler = raw_input("Bis wieviel: ")
        				Prozent_Fehler = float(Prozent_Fehler)
        				break
    				except ValueError:
        				print("Eine _Zahl_, bitte!")
				try:
       					Spannung = raw_input("ab welchem Wert: ")
        				Spannung = float(Spannung)
        				break
    				except ValueError:
        				print("Eine _Zahl_, bitte!")
						
	if len(row) > 1:
		idbewert.append(int(row[0]))  
		Haupt1.append(float(row[1]))
		Haupt2.append(float(row[2]))
		if abs(float(row[1])) <= abs(float(row[2]))
			AGK_Zuord = 0
			if abs(row[2]) > Spannung
				AGK = float((row[1]/row[2])*100)
				if AGK <= Prozent_Fehler
					AGK_Zuord = 1
				if Achsigkeit > Prozent_Fehler
					AGK_Zuord = 2
		if abs(row[2]) < abs(row[1])
			if abs(row[1]) > Spannung
				AGK = float((row[2]/row[1])*100)
				if AGK <= Prozent_Fehler
					AGK_Zuord = 1
				if Achsigkeit > Prozent_Fehler
					AGK_Zuord = 2
		rowret = [int(row[0]),AGK,AGK_Zuord]
    		writer.writerow(rowret)
# print(sx,sy,txy)  
filefem.close() 
ergebnisverrechnung.close()
Über einen Tipp würde ich mich sehr freuen.

Derzeit schreibe ich den Code im gedit. Gibt es unter Linux (Ubuntu 10.04 eine IDE, eventuell sogar mit Codeergänzung Quelltexttest des Syntax usw. in Analogie zu anderen Sprachen?

Wie kann ich die Werte in z.B. Haupt1 gezielt auslesen? In Pascal z.B. Haupt1[1] und in Python?

Gruß Und Dank Markus
Zuletzt geändert von mgolbs am Freitag 23. März 2012, 11:41, insgesamt 1-mal geändert.
deets

Ein paar Anmerkungen:

- das permanente int(<irgendwas>) bzw float(<irgendwas>) kannst du dir sparen. Ein float ist ein float und bleibt es auch. Auch "deklariert" man in python variablen nicht mittels

a = int(0)

Das ist einfach nur

a = 0

- statt if len(row) > 1 reicht ein else, oder falls tatsaechlich der Fall len(row) == 0 auftreten kann, dann sollte da ein elif stehen.

- hinter deiner if abs(float(...)) -Zeile fehlt einfach nur ein Doppelpunkt....

Generell solltest du dir mal ueberlegen, ein Python-Tutorial durchzuarbeiten. Darin kommt auch der Umgang mit Datenstrukturen vor.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ein Syntaxfehler hat nichts mit den Objekten hinter einem Namen zu tun ;-) Dir fehlt ein ":" am Ende des ``if``-Statements.

Code: Alles auswählen

if abs(float(row[1])) <= abs(float(row[2])):
Dann sollte es klappen.

Zu Deinem Code könnte man jetzt noch viel sagen, aber nur mal das nötigste. Benutze vier Spaces als Einrückung, nicht drei. Und benutze doch die speziellen Python-Code-Tags für Python-Quellcode hier im Forum :-)

Edit: Wie ich jetzt erst sah, taucht der Fehler mit dem Doppelpunkt ganz oft bei Dir auf - wie kann man denn so viel Code auf einmal schreiben, ohne den zwischendurch mal zu testen? :shock:
Gewöhne Dir schnell an, nicht so viel auf einmal zu schreiben, ohne zwischendurch zu prüfen, ob das ganze läuft.

Zudem solltest Du - wie deets auch schon anmerkte - schnell ein Tutorial durcharbeiten. Neben dem Umgang mit den gängigen Datenstrukturen sollte man sich auch schnell mit dem Konzept von Funktionen auseinander setzen. So langer Code will strukturiert werden - dann klappt alles viel besser ;-)

Noch eine Anmerkung; Dateien sollte man so öffnen:

Code: Alles auswählen

with open(...) as handler:
    # handler ist in diesem Block File-Objekt.
    # man braucht kein explizites ``close`` mehr.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mgolbs
User
Beiträge: 28
Registriert: Freitag 3. Februar 2012, 13:07

Hallo,

danke für die Hinweise, vor allem für :! Python-Code-Tags - da muss ich mich erst einmal schlau machen wie das geht.
Python-Tutorial - was ist da für die Arbeit mit Zahlen und csv's zu empfehlen? Das dicke Galileo Python 3 liegt schon vor mir.

Gruß und Dank Markus
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mgolbs hat geschrieben: Das dicke Galileo Python 3 liegt schon vor mir.
Bücher zum Thema Python aus diese Verlag sind hier im Forum eher verpöhnt. In anderen Foren habe ich mittlerweile erfahren, dass auch Bücher zu anderen Themen viele Fehler auf allen Ebenen enthalten. Ich weiß nicht, ob dieses Buch jetzt entsprechend überarbeitet ist oder nicht, deswegen würde ich mal das offizielle Tutorial empfehlen; gibts auch auf Deutsch: tutorial.pocoo.org. Ansonsten such mal im Forum; solche Fragen haben wir schon viel diskutiert.

"Das" Arbeiten mit CSV und Zahlen gibt es vermutlich nicht; Python an sich musst Du dennoch einfach so lernen, unabhängig von Deiner speziellen Domäne. Für "das Arbeiten mit Zahlen" könnte das ``numpy``-Modul noch interessant sein.

Edit: So, hier mal ein Link zu unserem Wiki.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten