2012-03-28 11 views
3

Ich habe eine CSV-Datei mit 3 Spalten von Daten. Ich muss eine neue Ausgabedatei erstellen, die einen bestimmten Datensatz aus der ersten und dritten Spalte der Originaldatei enthält. Die dritte Spalte enthält Dezimalwerte, und ich glaube, dass ich in einem solchen Fall die Funktion float() von Python verwende. Ich habe den folgenden Code versucht:Ungültiges Literal für float(): 0.000001, wie Fehler zu beheben?

in_file = open("filename.csv", "r") 

out_file = open("output.csv", "w") 

while True: 

    line = in_file.readline() 
    if (line == ''): 
     break 
    line = line.strip() 
    items = line.split(',') 
    gi_name = items[0] 
    if (gi_name.startswith("_")) 
     continue 
    p_value = float(items[2]) 
    if (p_value > 0.05): 
     continue 
    out_file.write(','.join([gene_name, str(p_value)])) 
in_file.close() 
out_file.close() 

, wenn ich die oben laufen, Ich erhalte die folgenden Fehler:

Fehler: ungültige wörtlichen für Schwimmer(): 0,000001

der Wert 0.0000001 ist die erste Wert in meinem Datensatz für die dritte Spalte, und ich denke, der Code kann nicht über diesen Satz hinaus lesen, aber ich bin mir nicht sicher warum. Ich bin neu bei Python und verstehe nicht wirklich, warum ich diesen Fehler bekomme oder wie ich ihn behebe. Ich habe andere Modifikationen versucht, wie man den float() eingibt, aber ohne Erfolg. Weiß jemand, wie ich das beheben könnte?

+3

Haben Sie überlegt, das ['csv'-Modul] (http://docs.python.org/library/csv.html) zu verwenden? –

+0

Das Hinzufügen einiger Zeilen Ihrer CSV-Datei zur Frage wäre für die Reproduktion hilfreich. –

Antwort

5

Von dem, was Sie auf dem Laufenden haben, ist es nicht klar, ob es etwas subtil falsch mit der Zeichenfolge Sie versuchen zu float() passieren (weil es sieht durchaus sinnvoll). Versuchen Sie, eine Debug-print-Anweisung hinzufügen:

print(repr(items[2])) 
p_value = float(items[2]) 

Dann sind Sie genau bestimmen können, was zu float() geben wird. Der Aufruf an repr() macht auch normalerweise unsichtbare Zeichen sichtbar. Fügen Sie das Ergebnis zu Ihrer Frage hinzu und wir können weiter kommentieren.

+0

Danke Greg, wenn ich Eingabe die repr (Artikel [2])) die folgende gedruckt: Traceback '1.10E-06 \ rGene2' (jüngste Aufforderung zuletzt): File „s6help.py “, Zeile 13, in P_Value = Schwimmer (Artikel [2]) so scheint es, ich habe ein \ rGene2, die in meinem Artikel versteckt ist [2]. Mein Code hat die Funktion .strip(), ich dachte, das würde die \ r und \ n entfernen. Ich habe meinen Code in .strip (\ r) geändert, aber er wurde trotzdem nicht entfernt. Ich weiß nicht, was ich sonst noch machen soll, haben Sie noch weitere Ideen? – student001

+0

Nun, das ist definitiv das Problem. Beachten Sie, dass '.strip()' nur Leerzeichen aus den * Enden * des Strings entfernt, während Ihr '\ r' in der Mitte des Strings steht. Sie müssen sich jetzt das CSV-Dateiformat und den Code ansehen, den Sie zum Lesen der Datei verwenden. Es ist möglich, dass Ihre Datei nur '\ r' Zeilenenden hat, was in Python nicht standardmäßig unterstützt wird. Scheint das wahrscheinlich? –

+0

Ja, das ist möglich, und ich glaube, das ist das Problem. Meine Zeilenenden enthalten \ r, und jeder Versuch, sie zu entfernen oder sie zu ersetzen, führt nur dazu, eine lange Zeile zu erstellen, was ich nicht möchte. Irgendwelche Vorschläge, wie man das \ r entfernt, aber immer noch getrennte Reihen behält? – student001

1

Ihre Datei hat wahrscheinlich ein nicht druckbares Zeichen, das gelesen wird. Versuchen Sie folgendes:

>>> a = '0.00001\x00' 
>>> a 
'0.00001\x00' 
>>> print(a) 
0.00001 
>>> float(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for float(): 0.00001 

Sie können sehen, dass a ein NUL-Zeichen hat, die nicht mit entweder print oder Ausnahme von Schwimmer gedruckt wird.

Verwandte Themen