如何基于CSV文件创建字典

3

我有一个 CSV 文件,其格式如下:

#ID #Number #Date #Name #Email
1978 26   24/4/10 Jim  Jim@randomemail.com
1328 31   22/7/10 Jim  Kim@randomemail.com
1908 26   21/4/10 Jim  Dim@randomemail.com
1918 26   29/4/10 Jim  Rim@randomemail.com
1938 46   24/4/10 Jim  Lim@randomemail.com

我已经打开并打印了csv文件。
现在我想把它变成一个字典,例如: [ID: 1978, Number : 26, Date : 24/4/10, Name : Jim, Email : Jim@randomemail.com], [等等], [等等]
我知道这可能很简单,但我是新手,已经卡了几个小时了。

你看过csv.DictReader吗? - jedwards
3个回答

4

在我的评论后面,考虑类似于以下内容:

import csv
with open('file.txt', 'r') as f:
    reader = csv.DictReader(f, delimiter=' ', skipinitialspace=True)
    for row in reader:
        print(row)

输出结果:

OrderedDict([('#ID','1978'),('#Number','26'),('#Date','24/4/10'),('#Name','Jim'),('#Email','Jim@randomemail.com')])
OrderedDict([('#ID','1328'),('#Number','31'),('#Date','22/7/10'),('#Name','Jim'),('#Email','Kim@randomemail.com')])
OrderedDict([('#ID','1908'),('#Number','26'),('#Date','21/4/10'),('#Name','Jim'),('#Email','Dim@randomemail.com')])
OrderedDict([('#ID','1918'),('#Number','26'),('#Date','29/4/10'),('#Name','Jim'),('#Email','Rim@randomemail.com')])
OrderedDict([('#ID','1938'),('#Number','46'),('#Date','24/4/10'),('#Name','Jim'),('#Email','Lim@randomemail.com')])

DictReader中的两个额外参数是为了使您的变量空格分隔的文件正确解析。

或者,如果您想一次获取所有行,请使用以下代码:

import csv
with open('file.txt', 'r') as f:
    reader = csv.DictReader(f, delimiter=' ', skipinitialspace=True)
    rows = list(reader)

print(rows)

生成

[
    OrderedDict([('#ID', '1978'), ('#Number', '26'), ('#Date', '24/4/10'), ('#Name', 'Jim'), ('#Email', 'Jim@randomemail.com')]), 
    OrderedDict([('#ID', '1328'), ('#Number', '31'), ('#Date', '22/7/10'), ('#Name', 'Jim'), ('#Email', 'Kim@randomemail.com')]), 
    OrderedDict([('#ID', '1908'), ('#Number', '26'), ('#Date', '21/4/10'), ('#Name', 'Jim'), ('#Email', 'Dim@randomemail.com')]), 
    OrderedDict([('#ID', '1918'), ('#Number', '26'), ('#Date', '29/4/10'), ('#Name', 'Jim'), ('#Email', 'Rim@randomemail.com')]), 
    OrderedDict([('#ID', '1938'), ('#Number', '46'), ('#Date', '24/4/10'), ('#Name', 'Jim'), ('#Email', 'Lim@randomemail.com')])
]

和,

print(rows[0]["#Email"])

产生

Jim@randomemail.com

更新

如果您的文件实际上是以 制表符 作为分隔符,您可以使用以下方法:

reader = csv.DictReader(f, delimiter='\t')

你应该通过打印行(就像你已经做过的那样)来确定分隔符,但要将其包装在repr调用中,例如print(repr(line))。如果在输出中看到\t,则表示它是以制表符分隔的。

我认为分隔符是'\t'(制表符)而不是空格,但这只是我的理解。 - hd1
1
@hd1 可以的,我的编辑器会自动替换--我会添加其他的Reader参数。 - jedwards

1

这是一些使用纯Python编写的代码,可以完成此操作:

for line in file_contents_2:
    line_contents = line.strip().split(",") # Removes the \n,
    # then turns the line into a list, where each value is seperated
    # by the comma      
    the_dictionary = {}
    reference = ["ORIN","DEST","HORIZ","BEAR"]
    for i in range(4): # iterates i=0 to i=3
        # Arrays start at 0, so a=[1,2,3]; a[1] would return 2
        the_dictionary[reference[i]] = line_contents[i]
    dictionary_list.append(the_dictionary)

谢谢回复,我已经将这个代码添加到我的程序中,但好像没有任何反应?https://imgur.com/a/7WadhrF - James
我没有包含打印语句。我编写的代码旨在替换您原始图片中的26-38行。 - Recessive

0

使用pandas将使您的生活更加轻松:

import pandas as pd
df = pd.read_csv('path_to_your_csv')
your_dict = df.to_dict()

就是这样,to_dict中有一些可选的参数可以帮助您按照所需格式进行格式化。


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