2017-07-07 7 views
3

Meine Eingabedatei hat die Form:Lese schwimmt aus der Datei mit Python

5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408, 
1.053E-09, 1.839E-09, 1.632E-10, 1.959E-12, 4.109, 3.683, 3.586, 3.650 

wo jede Zahl im Wesentlichen in einer Linie ist.

Was ich tun möchte, ist alle Floats zu lesen, und nur die Spalten 7 bis 10 an ein Array anfügen.

Hier ist, was ich geschrieben habe:

T=[] 
with open("test.txt", "r") as file1: 
    for line in file1.readlines(): 
     f_list = [float(i) for i in line.split(",")] 
     T.append(float(f_list[7])) 
     T.append(float(f_list[8])) 
     T.append(float(f_list[9])) 
     T.append(float(f_list[10])) 

Wenn ich die oben laufen erhalte ich:

ValueError: could not convert string to float: 

Ich denke, es mit dem float(i) Teil etwas falsch ist, aber ich kann ein nicht gefunden um es herum.

Ich habe Leute gesehen, die ähnliche Probleme haben, aber keine der Fixes, die ich bisher versucht habe, haben geholfen. Jede Hilfe wird sehr geschätzt. Kein

+0

Irgendwo dort hast du etwas, das kein Float als Text ist. Untersuche die Datei. –

+0

@ IgnacioVazquez-Abrams Es ist wahrscheinlich das nachgestellte Leerzeichen in seiner ersten Zeile, das den Fehler verursacht. Dadurch wird eine leere Zeichenfolge erzeugt. Und wenn das an float() übergeben wird, schlägt es fehl. –

+0

Ich verstehe es nicht. Jedes Float ist eine Linie, aber Sie haben Spalten? Meintest du Zeilen oder gibt es auf jeder Zeile mehr als einen Float? –

Antwort

4

das Problem ist, dass Ihre erste Zeile endet mit einem Komma:

5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408, 
1.053E-09, 1.839E-09, 1.632E-10, 1.959E-12, 4.109, 3.683, 3.586, 3.650 

Als Ergebnis Sie wollen einen String verarbeiten, dass nur Leerzeichen enthält (wie ' '). Und float(' ') versagt, da es keine Zahl ist (es tatsächlich meldet dies):

>>> float(' ') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not convert string to float: 
>>> float('a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not convert string to float: 'a' 

Aber ein Raum einfach unsichtbar ist, wenn gedruckt.

Sie können es lösen, indem eine Filteranweisung zur Liste Verständnis Zusatz:

T = [] 
with open("test.txt", "r") as file1: 
    for line in file1.readlines(): 
     f_list = [float(i) for i in line.split(",")if i.strip()] 
     T += f_list[7:11]

Des Weiteren wird diese wird nicht Arbeit seit keine der Zeilen 7-11 Schwimmer hat. Du wirst diese Floats also niemals hinzufügen.

Sie können jedoch den folgenden Code verwenden:

with open("test.txt", "r") as file1: 
    f_list = [float(i) for line in file1 for i in line.split(',') if i.strip()] 
    T = f_list[7:11] 

Dies T gleich führen wird:

>>> T 
[1.053e-09, 1.839e-09, 1.632e-10, 1.959e-12] 
2

Ihr Problem ist, dass, wenn Sie line aufgeteilt, die sich ergebende Liste höchstwahrscheinlich enthält Leerzeichen. Dies würde dazu führen, dass float() fehlschlägt. Sie müssen zuerst Ihre Teilungsliste bereinigen, indem Sie testen, ob ein Element tatsächlich eine gültige Gleitkommazahl ist. zB:

>>> def is_float(n): 
    try: 
     float(n) 
     return True 
    except: 
     return False 


>>> 
>>> line = '5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408,' 
>>> lst = [float(n) for n in line.split(',') if is_float(n)] 
>>> lst 
[5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408] 
>>>