2017-01-18 4 views
0

Mein Problem ist anders, weil es nicht mit regulären Ausdrücken handelt. also ich denke es ist ein bisschen anders. Ich habe diesen Fehler erhalten.Wie behandelt man ValueError: ungültiges Literal für float() in Python

ValueError: invalid literal for float(): 512220  0  20  34.4  
2.4  0  10010  913  52  0.00 

meine CSV-Datei sieht aus wie

512220  0  20  34.4  2.4  0  10010  913  52  0.00 
512221  1  30  34.6  2.3  0  10230  910.3  54  0.00 
512222  2  50  34.8  2.1  0  10020  932  56  0.00 
512223  3  60  35.4  2.5  0  10340  945.5  58  0.00 

meinen Code

with open(item[1]) as f: 
    lines = f.readlines() 
    print 'lines', lines 
for k, line in enumerate(lines): 
    data_temporary = line.strip().split("\r\n") 

ist, wenn ich "Linien" drucken habe ich

['512220  0  20  34.4  2.4  0  10010  913  52 
0.00\n', '512221  1  30  34.6  2.3  0  10230  910.3 
54  0.00\n', '512222  2  50  34.8  2.1  0  10020  
932  56  0.00\n', '512223  3  60  35.4  2.5 
0  10340  945.5  58  0.00'\n] 

follwing wenn ich data_temporary i print habe nur die folgende Zeile.

['160129 29 0000  0  0.04  5.3  2.04 
    0.00  11758  9.13  52  0.00'] 

Ich habe versucht, diese Befehle und Ergebnisse sind wie folgt. . data_temporary = line.strip(). Split (“„)

['512220', '', '', '', '', '', '', '0', '', '', '', '', '', '20', '', '', '', 
'', '', '', '34.4', '', '', '', '', '', '2.4', '', '', '', '', '', '0', '', '', 
'', '10010', '', '', '', '', '', '913', '', '','', '', '', '52', '', '', 
'', '', '', '0.00'] 

ich auf SO gefunden verschiedene Lösungen anzuwenden versuchte, konnte aber nicht. wie ich versuche zu verwenden

Ich denke, ich musste Liste in Zeichenfolge brechen und dann führen Sie die Operation darauf. könnte mir jemand helfen, dieses Problem zu lösen, damit ich es besser verstehe. Danke

+1

Warum Sie spalten sich auf '\ r \ n '? Iterieren über eine Datei iteriert über die * Zeilen *. Sie wollen nur 'line.split()', das auf * whitespace * aufteilt. In der Tat wird folgendes wahrscheinlich funktionieren: '[list (map (float, line.split())) für Zeile in f] ' –

+0

Mögliches Duplikat von [Zeichenfolge in Whitespace aufteilen in Python] (http://stackoverflow.com/questions/8113782/split-string-on-whitespace-in-python) – TemporalWolf

Antwort

1

Wenn Sie über eine Datei mit einer for Schleife iterieren, erhalten Sie eine Zeile pro Iteration. Dann können Sie split() auf dieser Zeile aufrufen, um sie durch Whitespace in eine Liste aufzuteilen.

with open('filename.txt', 'r') as f: 
    for line in f: 
     data = line.split() 
     print data 

     z = float(data[3]) 

Ausgang:

['512220', '0', '20', '34.4', '2.4', '0', '10010', '913', '52', '0.00'] 
['512221', '1', '30', '34.6', '2.3', '0', '10230', '910.3', '54', '0.00'] 
['512222', '2', '50', '34.8', '2.1', '0', '10020', '932', '56', '0.00'] 
['512223', '3', '60', '35.4', '2.5', '0', '10340', '945.5', '58', '0.00'] 

Viele Ihrer Elemente aussehen ganze Zahlen, so würde ich vorschlagen, nicht jedes Feld float konvertieren. Stattdessen würde ich die einzelnen Spalten auswählen und sie konvertieren.

Ich kenne den Namen Ihrer Felder nicht, also habe ich etwas gemacht. Hier einige Code, der diese Datei in eine Liste der Wörterbücher geladen werden kann, wo die Felder in den entsprechenden Typ umgewandelt wurden:

from pprint import pprint 

fields = [ 
    ('id', int), 
    ('n', int), 
    ('s', int), 
    ('a', float), 
    ('b', float), 
    ('z', int), 
    ('n2', int), 
    ('top', float), 
    ('x', int), 
    ('bottom', float), 
] 

def read_data(path): 
    with open(path, 'r') as f: 
     for line in f: 
      data = line.split() 

      res = {} 
      for n, field in enumerate(fields): 
       name, _type = field 
       res[name] = _type(data[n]) 
      yield res 

pprint(list(read_data('data.txt'))) 

Ausgang:

[{'a': 34.4, 
    'b': 2.4, 
    'bottom': 0.0, 
    'id': 512220, 
    'n': 0, 
    'n2': 10010, 
    's': 20, 
    'top': 913.0, 
    'x': 52, 
    'z': 0}, 
{'a': 34.6, 
    'b': 2.3, 
    'bottom': 0.0, 
    'id': 512221, 
    'n': 1, 
    'n2': 10230, 
    's': 30, 
    'top': 910.3, 
    'x': 54, 
    'z': 0}, 
{'a': 34.8, 
    'b': 2.1, 
    'bottom': 0.0, 
    'id': 512222, 
    'n': 2, 
    'n2': 10020, 
    's': 50, 
    'top': 932.0, 
    'x': 56, 
    'z': 0}, 
{'a': 35.4, 
    'b': 2.5, 
    'bottom': 0.0, 
    'id': 512223, 
    'n': 3, 
    'n2': 10340, 
    's': 60, 
    'top': 945.5, 
    'x': 58, 
    'z': 0}] 
+0

funktioniert. Vielen Dank für die Hilfe – rob

+0

Gern geschehen. Ich habe etwas Code hinzugefügt, um die Daten automatisch in die richtigen Typen zu parsen. Willkommen bei Stack Overflow, und denken Sie daran, alle hilfreichen Antworten zu bewerten und "akzeptieren" Sie diejenige, die Ihr Problem am besten löst. –

+0

Sie meinen, jede Spalte einzeln zu konvertieren? Kannst du ein Beispiel geben. Ich akzeptiere auch Ihre Antwort, weil Ihre Antwort gut funktioniert und auch josh, aber es scheint, ich kann nur eine – rob

0

'' ist kein gültiger Wert für Schwimmer .

Versuchen Sie data_temporary = line.split() und sehen, ob das funktioniert.

Oder mit einer Liste Verständnis:

values = [float(item) for item in line.split() if item]

+0

Vielen Dank für die Antwort. Ihre Lösung funktioniert auch einwandfrei. – rob

Verwandte Themen