从CSV文件创建字典

29
我想从CSV文件中获取输入,并将它们转换成字典格式(我使用Python 3.x)。我使用下面的代码来读取CSV文件,这个部分已经成功:

我想从CSV文件中获取输入,并将其转换为字典格式(我使用Python 3.x)。

我使用以下代码读取CSV文件,该代码可以正常工作:

import csv

reader = csv.reader(open('C:\\Users\\Chris\\Desktop\\test.csv'), delimiter=',', quotechar='|')

for row in reader:
    print(', '.join(row))
但现在我想把结果放到一个字典里。我希望CSV文件的第一行被用作字典的“键”字段,而CSV文件中的后续行填充数据部分。
示例数据:
     Date        First Name     Last Name     Score
12/28/2012 15:15        John          Smith        20
12/29/2012 15:15        Alex          Jones        38
12/30/2012 15:15      Michael       Carpenter      25

如何让字典正常工作?


从你的问题来看,你想要一个字典(在这种情况下)有4个键,[日期,名字,姓氏,分数],每个条目是相应列中所有项目的列表。但我有一种感觉,你的意思是希望每行的日期成为键,然后将[名字,姓氏,分数]作为值。 - Inbar Rose
一个小提示:当你需要显式地写出路径时,使用正斜杠而不是双反斜杠,比如 'C:/Users/Chris/Desktop/test.csv'。在Windows中可以正常工作。或者,你可以使用原始字符串,其中转义序列不被解释(因此不需要双反斜杠)-- r'C:\Users\Chris\Desktop\test.csv' - pepr
@ Inbar Rose:我的想法是创建一个字典,其中键为[日期、名字、姓氏和分数]。然后我希望将其余的数据放置在值字段中,但根据特定的键(标题字段)。这意味着键=>日期,值=>2012年12月28日15:15等等。 - gakar06
@ Inbar Rose:我更新了之前的代码,并得到了想要的结果。现在我想尝试将其发送到CSV文件,但我没有得到我想要的正确格式。它不会将每个单词打印在一起,而是每行打印每个字符(如果这有意义的话)。我在版本2下提供了上述代码,还提供了一些样例代码。这段代码可以正确地将数据发送到CSV文件,但它使用的是列表,而不是字典。也许你可以帮助我使用那种格式使字典能够正确导出到CSV文件。谢谢。 - gakar06
4个回答

68
创建一个字典,然后遍历结果并将行填入字典中。注意,如果您遇到具有重复日期的行,则必须决定要做什么(引发异常、替换先前行、丢弃较晚的行等)。
这是test.csv:
Date,Foo,Bar
123,456,789
abc,def,ghi

以及相应的程序:

import csv
reader = csv.reader(open('test.csv'))

result = {}
for row in reader:
    key = row[0]
    if key in result:
        # implement your duplicate row handling here
        pass
    result[key] = row[1:]
print(result)
带来:
{'Date': ['Foo', 'Bar'], '123': ['456', '789'], 'abc': ['def', 'ghi']}

或者,使用DictReader:

import csv
reader = csv.DictReader(open('test.csv'))

result = {}
for row in reader:
    key = row.pop('Date')
    if key in result:
        # implement your duplicate row handling here
        pass
    result[key] = row
print(result)

导致结果为:

{'123': {'Foo': '456', 'Bar': '789'}, 'abc': {'Foo': 'def', 'Bar': 'ghi'}}

或者你想将列标题映射到该列的值列表:

import csv
reader = csv.DictReader(open('test.csv'))

result = {}
for row in reader:
    for column, value in row.items():  # consider .iteritems() for Python 2
        result.setdefault(column, []).append(value)
print(result)

得到的结果是:

{'Date': ['123', 'abc'], 'Foo': ['456', 'def'], 'Bar': ['789', 'ghi']}

这是否可以在不导入库的情况下实现? - juanjedi

12

你需要使用Python的DictReader类。更多帮助可以从这里找到。

import csv

with open('file_name.csv', 'rt') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print row

2

来自@phil-frost的帮助非常有用,正是我所需要的。

之后我进行了一些微调,现在想在这里分享:

def csv_as_dict(file, ref_header, delimiter=None):

    import csv
    if not delimiter:
        delimiter = ';'
    reader = csv.DictReader(open(file), delimiter=delimiter)
    result = {}
    for row in reader:
        print(row)
        key = row.pop(ref_header)
        if key in result:
            # implement your duplicate row handling here
            pass
        result[key] = row
    return result

你可以称之为:

myvar = csv_as_dict(csv_file, 'ref_column')

其中ref_colum将是每一行的主键。


-1
import csv
def parser_csv(PATH):
    reader = csv.reader(open("{}.csv".format(PATH), 'r'))
    dict = {}
    list_dict = []
    counter = 0
    for row in reader:
        if counter == 0:
            first_row = row
            ecc = len(first_row)
            counter += 1
        else:
            for col in range(ecc):
                dict.update({first_row[col]:row[col]})
            list_dict.append(dict)
    return list_dict
print(len(parser_csv("path")))
# Have one less csv file (first row is keys of dict)

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