2017-05-22 2 views
0

Ich habe diese CSV-Datei. Ich möchte dies in ein Wörterbuch umwandeln. Diese CSV-Datei enthält 17584980 LinienCSV in Wörterbuch-Konvertierung

ozone,particullate_matter,carbon_monoxide,sulfure_dioxide,nitrogen_dioxide,longitude,latitude,timestamp,avgMeasuredTime,avgSpeed,extID,medianMeasuredTime,TIMESTAMP:1,vehicleCount,_id,REPORT_ID,Lat1,Long1,Lat2,Long2,Distance between 2 points,duration of measurements,ndt in kmh 
127,38,62,22,39,10.1050,56.2317,1406859600,74,50,668,74,1406859600,5,20746220,158324,56.2317,10.1050,56.2258,10.1166,1030,52,71 
122,35,61,17,34,10.1050,56.2317,1406859900,73,50,668,73,1406859900,6,20746392,158324,56.2317,10.1050,56.2258,10.1166,1030,52,71 
117,36,65,24,34,10.1050,56.2317,1406860200,61,60,668,61,1406860200,4,20746723,158324,56.2317,10.1050,56.2258,10.1166,1030,52,71 

Was ich

#code to generate dictionaries from csv file 
import csv 

reader = csv.DictReader(open('resultsout.csv')) 

output = open("finaldata.py","w") 

result = {} 
for row in reader: 
    for column, value in row.iteritems(): 
    result.setdefault(column, []).append(float(value)) 

output.write(str(result)) 

Fehler versucht haben:

Traceback (most recent call last): 
    File "dictionaries.py", line 11, in <module> 
    result.setdefault(column, []).append(float(value)) 
ialueError: invalid literal for float(): 32 

Aber dieser Code vor

arbeitete
+0

Was ist, wenn Sie 'Pandas' verwenden, um die' csv' Datei anzugehen? Ich denke, es ist mehr Bequemlichkeit und auch einfacher. – arnold

+1

Jetzt funktioniert es auch, In Python 2.7 habe ich den gleichen Code ausprobiert, aber editiere die Einrückung in dieser Zeile: result.setdefault (column, []). Append (float (value)) – Murali

+0

result.setdefault (column, [ ]). append (float (value)), In dieser Zeile versuchen Sie, einen Wert in float umzuwandeln, wenn ein ungültiger Literalwert auftritt, verursacht dies einen Fehler. – Murali

Antwort

1

Während das unsichere Art und Weise ist, was zu tun Sie wollen (nicht zu erwähnen, dass es einen kleinen Grund gibt, eine riesige CSV in einen riesigen Pyth umzuwandeln in der Datei), vorausgesetzt, dass Sie die Einrückung beheben, die Ihr Code funktionieren sollte - das Problem stammt von einigen Ihrer Daten, die Sie hier nicht gezeigt haben - ein Wert darin ist schlecht (wie 32\x00 oder 32\x07), die Konvertierung in float.

Hier ist, wie es zu handhaben:

import csv 

DEFAULT = 0.0 # value to use when conversion fails 

with open("resultsout.csv", "r") as i: 
    reader = csv.DictReader(i) 
    result = {k: [] for k in reader.fieldnames} 
    for row in reader: 
     for column, value in row.iteritems(): 
      try: 
       result[column].append(float(value)) 
      except ValueError: 
       result[column].append(DEFAULT) 
    with open("finaldata.py", "w") as o: 
     o.write(str(result)) 

oder optional können Sie nicht numerische Zeichen Streifen aus, bevor sichergestellt Umwandlung, dass die Umwandlung nicht scheitern, weil einige zusätzliche nicht druckbare Zeichen:

import csv 
import re 

STRIP_CHARS = re.compile(r"[^\d.]+") 

with open("resultsout.csv", "r") as i: 
    reader = csv.DictReader(i) 
    result = {k: [] for k in reader.fieldnames} 
    for row in reader: 
     for column, value in row.iteritems(): 
      result[column].append(float(STRIP_CHARS.sub("", value))) 
    with open("finaldata.py", "w") as o: 
     o.write(str(result)) 

Oder Sie können beide für maximale Zuverlässigkeit kombinieren.

+0

Sie haben Recht, Sir. Es gab wenige Zeilen, die "32^M" hatten. Ihr Code funktioniert perfekt, vielen Dank – Mikasa