python用两个键将带有行和列标题的csv文件读入字典

Posted

技术标签:

【中文标题】python用两个键将带有行和列标题的csv文件读入字典【英文标题】:python read csv file with row and column headers into dictionary with two keys 【发布时间】:2016-06-20 03:42:24 【问题描述】:

我有以下格式的csv文件,

,col1,col2,col3
row1,23,42,77
row2,25,39,87
row3,48,67,53
row4,14,48,66

我需要将它读入包含两个键的字典中,这样

dict1['row1']['col2'] = 42
dict1['row4']['col3'] = 66

如果我尝试将csv.DictReader 与默认选项一起使用

with open(filePath, "rb" ) as theFile:
    reader = csv.DictReader(theFile, delimiter=',')
    for line in reader:
    print line

我得到以下输出

'': 'row1', 'col2': '42', 'col3': '77', 'col1': '23'
'': 'row2', 'col2': '39', 'col3': '87', 'col1': '25'
'': 'row3', 'col2': '67', 'col3': '53', 'col1': '48'
'': 'row4', 'col2': '48', 'col3': '66', 'col1': '14'

我不确定如何处理此输出以创建我感兴趣的字典类型。

为了完整起见,如果您能解决如何将字典写回具有上述格式的 csv 文件,这也会有所帮助

【问题讨论】:

【参考方案1】:

使用 CSV 模块:

import csv
dict1 = 

with open("test.csv", "rb") as infile:
    reader = csv.reader(infile)
    headers = next(reader)[1:]
    for row in reader:
        dict1[row[0]] = key: int(value) for key, value in zip(headers, row[1:])

【讨论】:

我有一个问题,字典中的值是字符串而不是整数。如何确保字典中的值是整数 查看我的编辑 - 只需在每个值上调用 int();但是,即使单个值也无法转换为整数,这将失败。 为了完整起见,您能否还描述如何将字典写回上述格式的csv文件。我已经编辑了我的问题,需要这样的回应。【参考方案2】:

您可以为此使用pandas,即使它有点矫枉过正。优点是几乎不需要任何代码来获得预期的结果。

# Reading the file
df = pd.read_csv('tmp.csv', index_col=0)

# Creating the dict
d = df.transpose().to_dict(orient='series')

print(d['row1']['col2'])
42

【讨论】:

这个答案很优雅。不幸的是,我正在使用 Pandas 不存在的服务器。我现在不想修改任何 python 设置,因为它可能会破坏其他感兴趣的包。【参考方案3】:

输入文件的格式不太方便用csv模块解析。我会分别解析标题,然后逐行解析其余部分,按, 拆分,沿途剥离和制作字典。工作代码:

from pprint import pprint

d = 
with open("myfile.csv") as f:
    headers = [header.strip() for header in next(f).split(",")[1:]]

    for line in f:
        values = [value.strip() for value in line.split(",")]
        d[values[0]] = dict(zip(headers, values[1:]))

pprint(d)

打印:

'row1': 'col1': '23', 'col2': '42', 'col3': '77',
 'row2': 'col1': '25', 'col2': '39', 'col3': '87',
 'row3': 'col1': '48', 'col2': '67', 'col3': '53',
 'row4': 'col1': '14', 'col2': '48', 'col3': '66'

【讨论】:

以上是关于python用两个键将带有行和列标题的csv文件读入字典的主要内容,如果未能解决你的问题,请参考以下文章

使用 bash (sed/awk) 提取 CSV 文件中的行和列?

基于主键将两个表从BigQuery导出到CSV

pandas为csv添加新的行和列

重命名数据框的行和列

根据行和列确定字母 - python

使用r自动选择.csv文件中的行和列