Datei einlesen, line als Integer oder String

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
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Zuletzt geändert von numerix am Montag 26. Oktober 2009, 14:20, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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

Code: Alles auswählen

for line in lines:
    key, value = line.split('=', 1)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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