Python CSV到字典的转换

Python CSV到字典的转换,python,csv,dictionary,Python,Csv,Dictionary,我有这个csv文件。我想把这个转换成字典。此csv文件包含17584980行 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,Lo

我有这个csv文件。我想把这个转换成字典。此csv文件包含
17584980

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
我试过的

#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))
错误:

Traceback (most recent call last):
  File "dictionaries.py", line 11, in <module>
    result.setdefault(column, []).append(float(value))
ialueError: invalid literal for float(): 32
回溯(最近一次呼叫最后一次):
文件“dictionaries.py”,第11行,在
result.setdefault(列,[]).append(float(值))
ialueError:浮点()的文本无效:32

但是这段代码以前就已经运行过了,而这是一种不安全的方式来做你想做的事情(更不用说有一点理由将一个巨大的CSV转换成一个巨大的Python文件),前提是你修复了代码应该运行的缩进-问题源于你没有在这里显示的一些数据-其中的一些值是不好的(如
32\x00
32\x07
)无法转换为浮点

以下是处理方法:

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))
或者,您可以选择在转换之前去掉非数字字符,以确保转换不会因为某些额外的不可打印字符而失败:

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))

或者您可以将两者结合起来以获得最大的可靠性。

如果您使用
pandas
来处理
csv
文件会怎么样?我认为它更方便,也更容易。现在它也可以工作了,在python 2.7中,我尝试了相同的代码,但编辑了这一行的缩进:result.setdefault(column,[]).append(float(value))result.setdefault(列,[])。append(float(value)),在这一行中,您试图将一些值转换为float,如果出现任何无效的文本值,则会导致错误。请在代码中尝试一种方法,并将其粘贴到问题中,按如下方式打印值:Print(repr(value))在for循环中,只需将日志粘贴到发生错误的地方。我猜将有一些无法打印的字符与值一起使用,例如:“32\x00”,这样,当您使用repr打印值时,我们就可以了解真正发生的情况。您是对的,先生。很少有行具有
“32^M”
。您的代码工作得很好,非常感谢