将CSV文件转换为字典列表

67

我有一个csv文件

col1, col2, col3
1, 2, 3
4, 5, 6

我想从这个CSV文件创建一个字典列表。

输出为:

a= [{'col1':1, 'col2':2, 'col3':3}, {'col1':4, 'col2':5, 'col3':6}]

我该如何做到这一点?

8个回答

112
使用 csv.DictReader
import csv

with open('test.csv') as f:
    a = [{k: int(v) for k, v in row.items()}
        for row in csv.DictReader(f, skipinitialspace=True)]

会导致:
[{'col2': 2, 'col3': 3, 'col1': 1}, {'col2': 5, 'col3': 6, 'col1': 4}]

5
对于链接页面中的懒惰者,“skipinitialspace”:当为“True”时,分隔符后紧跟的空格将被忽略。 - Flash
2
@falsetru,为什么输出的顺序不是按照这个顺序呢? [{'col1':1, 'col2':2, 'col3':3}, {'col1':4, 'col2':5, 'col3':6}] - V-T
3
如果你使用 Python 3.6+,可以使用 OrderedDict 来保证顺序:https://docs.python.org/3/library/csv.html#csv.DictReader - falsetru
2
@hpy,自Python 3.7+起,字典的插入顺序是有保证的。https://mail.python.org/pipermail/python-dev/2017-December/151283.html => 不用担心,只需使用DictReader :) - falsetru
1
@hpy,这在"Python 3.7的新特性-摘要-发布亮点"中提到:> Python数据模型改进:字典对象的插入顺序保留特性已被宣布为Python语言规范的正式部分。 - falsetru
显示剩余5条评论

39

另一个更简单的答案:

import csv
with open("configure_column_mapping_logic.csv", "r") as f:
    reader = csv.DictReader(f)
    a = list(reader)
    print a

这会把它转换成元组列表,而不是字典? - ndtreviv
print(a)应该放在with块之外,因为此时文件不再需要。另外,为什么不使用a = list(csv.DictReader(f)) - pabouk - Ukraine stay strong

10

使用csv模块和列表推导式:

import csv
with open('foo.csv') as f:
    reader = csv.reader(f, skipinitialspace=True)
    header = next(reader)
    a = [dict(zip(header, map(int, row))) for row in reader]
print a    

输出:

[{'col3': 3, 'col2': 2, 'col1': 1}, {'col3': 6, 'col2': 5, 'col1': 4}]

6

很久没看到更新或相关答案,我在此回答。

df = pd.read_csv('Your csv file path')  
data = df.to_dict('records')
print( data )

2
# similar solution via namedtuple:    

import csv
from collections import namedtuple

with open('foo.csv') as f:
  fh = csv.reader(open(f, "rU"), delimiter=',', dialect=csv.excel_tab)
  headers = fh.next()
  Row = namedtuple('Row', headers)
  list_of_dicts = [Row._make(i)._asdict() for i in fh]

只有与 CSV 相同顺序的答案才会被获取。 - V-T

1
简单的方法将CSV解析为字典列表
with open('/home/mitul/Desktop/OPENEBS/test.csv', 'rb') as infile:
  header = infile.readline().split(",")
  for line in infile:
    fields = line.split(",")
    entry = {}
    for i,value in enumerate(fields):
      entry[header[i].strip()] = value.strip()
      data.append(entry)

1

嗯,当其他人以聪明的方式去做时,我采用了天真的方法来实现它。我想我的方法的好处是不需要任何外部模块,尽管它在特殊值的配置下可能会失败。这里只是作为参考:

a = []
with open("csv.txt") as myfile:
    firstline = True
    for line in myfile:
        if firstline:
            mykeys = "".join(line.split()).split(',')
            firstline = False
        else:
            values = "".join(line.split()).split(',')
            a.append({mykeys[n]:values[n] for n in range(0,len(mykeys))})

0

针对你的问题,我的解决方案如下:

output = []

with open("test.csv", "r") as csv_file:
    data = csv_file.read().split("\n")

text = [data[i].split(",") for i in range(len(data))]

for i in range(1, len(text)) :
    output.append({text[0][num]:text[i][num] for num in range(len(text[i]))})

输出为字典列表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接