2017-06-29 2 views
2

Ich habe eine CSV mit Zahlen, die ich in Floats umwandeln möchte.Warum zeigt Python 'ValueError: String konnte nicht in Float umgewandelt werden?

filename = "filename.csv" 
enclosed_folder = "path/to/Folder" 
full_path = os.path.join(enclosed_folder,filename) 

with open(full_path) as input_data: 
    temp = input_data.readlines() 
    n = len(temp) #int(temp.pop(0)) 
    matrix = [x.split(" ") for x in temp] 
    for i in range(n): 
     for j in range(n): 
      matrix[i][j] = float(matrix[i][j]) 
    input_data.close() 

Wenn ich die Datei in einem beliebigen Texteditor öffnen, es zeigt nicht die \n am Ende jeder Zeile.

enter image description here

Aber das Python-Code ausgeführt wird zeigt die `Valueerror: nicht String umwandeln könnte‚wegen ‚\ n zu schweben‘ am Ende jeder Zeile vorhanden ist.

Traceback (most recent call last): 
    File "hierarchical-clustering.py", line 37, in <module> 
    matrix[i][j] = float(matrix[i][j]) 
ValueError: could not convert string to float: '1,0.058824,0.076923,0.066667,0.055556,0.058824,0.071429,0.052632,0.076923,0.0625,0.0625,0.055556,0.055556,0.05,0.066667,0,0,0.055556,0.0625,0.058824,0.058824,0.047619,0.055556,0.0625,0,0.052632,0.066667,0.055556,0.0625,0.058824,0.041667,0.066667,0.058824,0.071429,0.066667,0.076923,0,0.083333,0.052632,0.071429,0.076923,0,0.0625,0.076923,0.058824,0.076923,0.055556,0,0.0625,0.071429,0.0625,0.0625,0.083333,0,0,0,0.058824,0.0625,0,0.058824,0.0625,0.0625,0.066667,0.0625,0.052632,0.066667,0.076923,0.058824,0.071429,0.066667,0.058824,0.071429,0.058824,0.071429,0.058824,0.071429,0.071429\n' 

Also, wie behebe ich diesen Fehler?

EDIT: verwendete ich strip() sowie rstrip() wie in einigen der Antworten vorgeschlagen Leerzeichen zu entfernen, aber der Fehler geht nicht weg:

Traceback (most recent call last): 
    File "hierarchical-clustering.py", line 37, in <module> 
    matrix[i][j] = float(matrix[i][j].rstrip()) 
ValueError: could not convert string to float: '1,0.058824,0.076923,0.066667,0.055556,0.058824,0.071429,0.052632,0.076923,0.0625,0.0625,0.055556,0.055556,0.05,0.066667,0,0,0.055556,0.0625,0.058824,0.058824,0.047619,0.055556,0.0625,0,0.052632,0.066667,0.055556,0.0625,0.058824,0.041667,0.066667,0.058824,0.071429,0.066667,0.076923,0,0.083333,0.052632,0.071429,0.076923,0,0.0625,0.076923,0.058824,0.076923,0.055556,0,0.0625,0.071429,0.0625,0.0625,0.083333,0,0,0,0.058824,0.0625,0,0.058824,0.0625,0.0625,0.066667,0.0625,0.052632,0.066667,0.076923,0.058824,0.071429,0.066667,0.058824,0.071429,0.058824,0.071429,0.058824,0.071429,0.071429' 
+1

Ich glaube nicht 'float' kümmert sich um neue Zeilen. Ich habe gerade 'float (" 1.0 \ n ")' auf meinem Rechner versucht und es gibt mir glücklicherweise '1.0'. Ich denke, das Problem sind deine Kommas. 'float (" 1,2 ")' funktioniert beispielsweise nicht. – Kevin

+1

Haben Sie darüber nachgedacht, das 'csv'-Modul zum Lesen Ihrer CSV-Datei zu verwenden? Wenn Sie das verwenden, anstatt die Datei manuell zu analysieren, führt IIRC in Ihrem Auftrag eine rudimentäre Typkonvertierung durch. Dann müssen Sie überhaupt nicht 'float' aufrufen. – Kevin

+1

@Kevin - Nein, Pythons 'csv' nimmt keine Typen an. Es berücksichtigt absichtlich alles eine Schnur. (Dies ist sowohl mehr Pythonic (explizit ist besser als implizit) und vermeidet eines der Dinge, die Programmierer am meisten über Excel hassen.) –

Antwort

6

Der Fehler liegt an Ihrer Zeilenanalyse. Sie trennen auf Leerzeichen, nicht Kommas, was nach Ihrem Screenshot geschehen sollte. Der Schlüssel ist der Fehler, der zurückgegeben wird. Es wird versucht, die gesamte Zeile von einem String in einen Float umzuwandeln.

Wechsel:

matrix = [x.split(" ") for x in temp] 

An:

matrix = [x.split(",") for x in temp] 
+0

Verdammt! Was für ein dummer Fehler. – Kristada673

+2

@ Kristada673, es passiert uns allen. Das beste, was zu tun ist, lesen Sie die Fehlermeldungen sehr sorgfältig, um die Ursache zu ermitteln. Sonst wirst du wahrscheinlich in ein Kaninchenloch gehen und eine Menge Zeit verschwenden, bevor du erkennst, wie einfach der Fehler war. – RobB

2

Sie strip() verwenden können Leerzeichen entfernen die Saite.

matrix[i][j] = float(matrix[i][j].strip()) 

Wenn die Kommas Sie sind beunruhigend, Sie .split(',') mit Komma wünschen konnte und keine Leerzeichen:

matrix = [x.strip().split(",") for x in temp] 
1

das Newline char entfernen mit rstrip() wie folgt aus:

matrix[i][j] = float(matrix[i][j].rstrip()) 
Verwandte Themen