用Python将带有行和列标题的CSV文件读入字典中,并使用两个键。

13

我有一个以下格式的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文件,则会有所帮助。

3个回答

28

使用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:])}

1
我有一个问题,字典中的值是字符串而不是整数。我该如何确保字典中的值为整数? - rambalachandran
1
看我的编辑 - 只需对每个值调用 int(); 但是,如果有一个值无法转换为整数,这将失败。 - Tim Pietzcker
1
为了保证完整性,您能否描述如何按上述格式将字典写回到CSV文件中。我已编辑了我的问题,需要这样的回答。 - rambalachandran

7
你可以使用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设置,因为这可能会破坏其他有用的软件包。 - rambalachandran

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'}}

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