.readline() geht file nicht komplett durch

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
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

Hallo ich habe ein Problem mit der .readline() Funktion.

Zunächst habe ich den Code so aufgebaut:

Code: Alles auswählen

def reading_datasets(filepath):      #reading the required datasets
    file = open(filepath,"r")
    targetlist = []
    
    for line in file:
        if line[0:3]=='smi':            #check if line begins with 'smi'
            targetlist.append(line)      #to identify the required datasets

    file.close()
    return targetlist
    
Da das gesamte Script auf einem Websphere laufen soll habe ich es getestet aber es gibt Probleme mit

Code: Alles auswählen

for line in file
Daher habe ich die Funktion, wie folgt umgebaut, nun läuft das Script auf dem Websphere, jedoch wird die ausgewählte Datei nicht mehr vollkommen ausgelesen

Code: Alles auswählen

def reading_datasets(filepath):      #reading the required datasets
    file = open(filepath,"r")
    targetlist = []
    while file.readline():
        line = file.readline()
        if line[0:3]=='smi':            #check if line begins with 'smi'
            targetlist.append(line)      #to identify the required datasets
    file.close()
    return targetlist
Hat jemand ne Idee was da falsch läuft?
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

Kurzes Update: die File wird doch fertig gelesen jedoch wird nur jede zweite Zeile bearbeitet
deets

Na, du rufst readline ja zweimal auf. Einmal im while, und einmal danach.

Code: Alles auswählen


for line in file:
     ...

Das sollte gehen.
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

Problem gelöst, folgender Code läuft:

Code: Alles auswählen

def reading_datasets(filepath):      #reading the required datasets
    file = open(filepath,"r")
    lines = file.readlines()
    targetlist = []
    for line in lines:
        #print (line)
        if line[0:3]=='smi':            #check if line begins with 'smi'
            targetlist.append(line)      #to identify the required datasets
    file.close()
    return targetlist
Danke für den Tipp
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

with sollte noch benutzt werden!
Außerdem reicht es,

Code: Alles auswählen

for line in input_file:
zu iterieren, es ist nicht nötig, dafür die komplette Datei vorher in den Speicher zu lesen.
Zuletzt geändert von mkesper am Freitag 6. Mai 2011, 08:30, insgesamt 1-mal geändert.
lunar

@Basti91: Wenn dieser Quelltext funktioniert, dann muss auch der aus Deinem ersten Beitrag funktionieren. Also kannst Du darauf verzichten, alle Zeilen auf einmal einzulesen, und stattdessen wieder zeilenweise lesen:

Code: Alles auswählen

with open(filepath, 'r') as stream:
    for line in stream:
        …
BlackJack

@Basti91: Was ist denn das Problem bei ``for line in file:``?
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ansonsten täte es noch eine List Comprehension (LC), da du ohnehin eine Liste zurückgibst:

ungetestet:

Code: Alles auswählen

with open(path, 'r') as stream:
    return [line for line in stream if line.startswith('smi')]
Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

@BlackJack: Das Problem liegt an der Websphere, die diesen Befehl komischerweise nicht ausführen konnte :K
BlackJack

@Basti91: Was bedeutet das *genau*? Welche Fehlermeldung bekommst Du? (Welche Python-Version wird denn dort verwendet?)
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

Es wird Jthon verwendet
BlackJack

@Basti91: Und was ist die Fehlermeldung? Auch in Jython sind Dateiobjekte iterierbar.
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

@BlavkJack: Tut mir leid, ich kann dir echt nichts genaueres über die Websphere sagen, da ich mich auch erst am einarbetien bin.
lunar

@Basti91: Na, Du wirst doch wohl irgendetwas genaueres über den Fehler sagen können als „geht nicht“? Woran erkennst Du denn sonst überhaupt, dass "for line in file:" nicht funktioniert?
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

Habe den alten Code jetzt nochmal ausgekramt und auf der websphere ausgeführt:

Code: Alles auswählen

def eintraege_auslesen(dateipfad):      #Benötigte Datensätze auslesen
    datei = open(dateipfad,"r")
    zielliste = []
    
    for line in datei:
        if line[0:3]=='smi':            #Überprüfen ob die ersten 3 char der Zeile 'smi'
            zielliste.append(line)      #sind um benötigten Datensatz zu identifizieren

    return zielliste
    datei.close()

Folgende Fehlermeldung wird mir zu oben genannter Codepassage geworfen:
: command not found:
./script.py: line 6: syntax error near unexpected token `('
./script.py: line 6: `def eintraege_auslesen(dateipfad): #Benötigte Datens'¤tze auslesen
BlackJack

@Basti91: Da hat Python keine Probleme mit `readline()`, sondern eine Unix-Shell verständlicherweise Probleme damit Python-Quelltext auszuführen. Wie gibt man denn bei Websphere an mit welchem Programm ein Skript ausgeführt werden soll? Das scheint hier schief gelaufen zu sein.
Antworten