Seite 1 von 1
Datei einlesen, line als Integer oder String
Verfasst: Montag 26. Oktober 2009, 14:13
von redbomberle
Hi zusammen, versuche gerade eine Datei einzulesen und die eingelesenen Zeilen als Integer oder als String in meiner Klasse zu speichern:
Code: Alles auswählen
for line in data_file:
c = c+1;
print("line",c)
if(c == 3):
windowsize = (line.strip(" \t\r\n;"))
lgg.setWindowSizeDetection(windowsize)
//lgg ist Klasse vom Typ Logger
elif(c == 5):
lgg.setOffsetDetection((line.strip(" \t\r\n;")))
elif(c == 7):
lgg.setWindowSizeSpike((line.strip(" \t\r\n;")))
elif(c == 9):
lgg.setNumberOfSlides((line.strip(" \t\r\n;")))
...
Für den Fall dass c==3 sollte die Methode setWindowSizeDetection() der folgenden Klasse aufgerufen werden:
Code: Alles auswählen
class Logger:
def __init__(self):
self.window_size_detection = 0;
self.offset_detection = 0;
self.window_size_spike = 0;
self.input_path=""
def setWindowSizeDetection(v):
self.window_size_detection = v;
...
Es kommt jedoch eine Fehlermeldung, dass der Methode setWindowSizeDetection() mehr als ein Parameter übergeben werden.
Warum? Da durch (line.strip(" \t\r\n;")) ein Tuple entsteht.
Kann ich dieses Tuple nicht irgendwie zu einem einfachen String bzw zu einem einfacher Integer zusammenfassen?
Re: Datei einlesen, line als Integer oder String
Verfasst: Montag 26. Oktober 2009, 14:18
von numerix
redbomberle hat geschrieben:Es kommt jedoch eine Fehlermeldung, dass der Methode setWindowSizeDetection() mehr als ein Parameter übergeben werden.
Warum? Da durch (line.strip(" \t\r\n;")) ein Tuple entsteht.
Kann ich dieses Tuple nicht irgendwie zu einem einfachen String bzw zu einem einfacher Integer zusammenfassen?
Du deutest das falsch. Hier entsteht kein Tupel, sondern der String bleibt, was er ist. Aber in deiner Methode fehlt das "self" als erster Parameter.
Ansonsten ist dein Code auch nicht optimal und ich vermute, dass du Grundlagen der OOP in Python nicht verstanden hast. Auch dein Kommentar, lgg wäre eine Klasse vom Typ soundso ist Unsinn.
Verfasst: Montag 26. Oktober 2009, 14:19
von Hyperion
Es wäre schon hilfreich zu sehen, wie genau das Tupel denn aussieht, das durch line.strip(" \t\r\n;") erzeugt wird.
Aber mal nebenbei: Das kommt mir sehr bekannt vor... hatten wir diesen Code nicht hier schon einmal? Iirc hatte ich da von c==3 usw abgeraten und auf ein Dict verwiesen... (desweiteren könnte man enumerate() benutzen, um sich den Index zu sparen...)
Ich muss da doch mal suchen...
Edit: Ha, wußte ich 's doch!
http://www.python-forum.de/viewtopic.ph ... ht=#149264
Noch mal ein paar Fragen: Wie genau sieht denn so eine Datei aus? Um welches Format handelt es sich dabei? Kannst Du das beeinflussen, oder ist es ein gegebenes?
Verfasst: Montag 26. Oktober 2009, 14:34
von redbomberle
also mit dem self Parameter hat dann alles funktioniert. Sollte ich mir also merken dass dieser self Parameter bei einer Klassen-Methode mit übergeben wird.
@Hyperion
1.
ja den Tip hattest du mir schon vor einiger Zeit gegeben. Hatte es auch versucht einzubauen aber noch nicht hinbekommen.
2.
Die Datei von der ich die Daten einlese hat folgenden Aufbau:
Code: Alles auswählen
#following lines contains stored settings
#window_size_detection
100000
#offset_detection
20000
#window_size_spike
45001
#number_slides
Den Aufbau habe ich selbst gewählt, diesen kann ich also nach Belieben verändern.
3.
Wenn ich mir das Ergebnis von line.strip ausgebe wird schon immer der passende Wert ausgegeben.
Da ich jetzt noch den self-Parameter zu den jeweiligen Methoden hinzugefügt habe, hat sich denke ich das Problem gelöst. Zumdindest werden nun alle Variablen dieser Klasse korrekt initialisiert.
Verfasst: Montag 26. Oktober 2009, 14:37
von numerix
redbomberle hat geschrieben:also mit dem self Parameter hat dann alles funktioniert. Sollte ich mir also merken dass dieser self Parameter bei einer Klassen-Methode mit übergeben wird.
Dir fehlen die begrifflichen Grundlagen der OOP!
Eine Klassenmethode gibt es in deinem Beispiel gar nicht ...
Verfasst: Montag 26. Oktober 2009, 14:38
von jbs
wie wärs es denn mit:
Code: Alles auswählen
#following lines contains stored settings
window_size_detection=100000
offset_detection=20000
window_size_spike=45001
und dann mit
Verfasst: Montag 26. Oktober 2009, 14:52
von Hyperion
Oder benutze JSON für die Config-datei:
Code: Alles auswählen
{
"window_size_detection": 100000,
"offset_detection": 20000,
"window_size_spike": 45001
}
Und dann einfach:
Code: Alles auswählen
class Logger:
def __init__(self, window_size_detection=0, offset_detection=0,
window_size_spike=0):
self.window_size_detection = window_size_detetcion
self.offset_detection = offset_detection
self.window_size_spike = window_size_spike
self.input_path=""
def get_config():
config_params = {}
try:
with open("config.json", "r") as config_file:
config_params = json.load(config_file)
except IOError, e:
print e
else:
return config_params
# Parameter laden und parsen
config_params = get_config()
# Objekt erzeugen und entpacktes Dict übergeben
log = Logger(**config_params)
Alternativ gibt es natürlich noch das INI-Format und dazu den passenden Parser aus der Standard Lib für den Anfang.
Verfasst: Montag 26. Oktober 2009, 16:30
von ms4py
Hyperion hat geschrieben:Alternativ gibt es natürlich noch das INI-Format und dazu den passenden Parser aus der Standard Lib für den Anfang.
Oder das Modul ConfigObj, das wirklich gut verständlich ist und auch eine sehr komfortablere API hat.
http://www.voidspace.org.uk/python/configobj.html
Verfasst: Montag 26. Oktober 2009, 19:54
von BlackJack
@redbomberle: Warum heisst `lgg` nicht `logger`? Dann braucht man keine Kommentare um zu erklären wofür `lgg` steht.
Diese ganzen Setter-Methoden kommen mir auch recht unpythonisch vor. Man kann auch direkt die Attribute setzen, oder vielleicht besser erst die Konfigurationsdatei komplett auswerten und die Daten dann der `Logger.__init__()` als Argumente übergeben.
``if`` ist keine Funtkion, darum sollte man den Quelltext nicht so schreiben, dass es wie eine aussieht. Die Klammern um die Bedingungen sind überflüssig.
Ansonsten gäb's noch den `ConfigParser` in der Standardbibliothek.