gpt4 book ai didi

python - 使用Python CSV DictReader创建多级嵌套字典

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:18 26 4
gpt4 key购买 nike

这里完全是 Python 菜鸟,可能遗漏了一些明显的东西。我到处搜索但还没有找到解决方案,所以我想我会寻求一些帮助。

我正在尝试编写一个函数,该函数将从大型 csv 文件构建嵌套字典。输入文件格式如下:

Product,Price,Cost,Brand,
blue widget,5,4,sony,
red widget,6,5,sony,
green widget,7,5,microsoft,
purple widget,7,6,microsoft,

等...

我需要的输出字典如下所示:

projects = { `<Brand>`: { `<Product>`: { 'Price': `<Price>`, 'Cost': `<Cost>` },},}

但显然许多不同的品牌包含不同的产品。在输入文件中,数据按品牌名称的字母顺序排序,但我知道一旦 DictReader 执行它就会变得无序,所以我肯定需要一种更好的方法来处理重复项。所写的 if 语句是多余的和不必要的。

这是我目前无法使用的无用代码:

def build_dict(source_file):
projects = {}
headers = ['Product', 'Price', 'Cost', 'Brand']
reader = csv.DictReader(open(source_file), fieldnames = headers, dialect = 'excel')
current_brand = 'None'
for row in reader:
if Brand != current_brand:
current_brand = Brand
projects[Brand] = {Product: {'Price': Price, 'Cost': Cost}}
return projects

source_file = 'merged.csv'
print build_dict(source_file)

当然,我已经在文件顶部导入了 csv 模块。

执行此操作的最佳方法是什么?我觉得我偏离了路线,但是关于从 CSV 创建嵌套字典的可用信息很少,而且那里的例子非常具体,往往不会详细说明解决方案实际起作用的原因,所以作为 Python 的新手,很难下结论。

此外,输入的 csv 文件通常没有标题,但为了尝试获得此函数的工作版本,我手动插入了一个标题行。理想情况下,会有一些代码分配 header 。

非常感谢任何帮助/指导/建议,谢谢!

最佳答案

import csv
from collections import defaultdict

def build_dict(source_file):
projects = defaultdict(dict)
headers = ['Product', 'Price', 'Cost', 'Brand']
with open(source_file, 'rb') as fp:
reader = csv.DictReader(fp, fieldnames=headers, dialect='excel',
skipinitialspace=True)
for rowdict in reader:
if None in rowdict:
del rowdict[None]
brand = rowdict.pop("Brand")
product = rowdict.pop("Product")
projects[brand][product] = rowdict
return dict(projects)

source_file = 'merged.csv'
print build_dict(source_file)

产生

{'microsoft': {'green widget': {'Cost': '5', 'Price': '7'},
'purple widget': {'Cost': '6', 'Price': '7'}},
'sony': {'blue widget': {'Cost': '4', 'Price': '5'},
'red widget': {'Cost': '5', 'Price': '6'}}}

来自您的输入数据(其中 merged.csv 没有标题,只有数据。)

我在这里使用了一个defaultdict,它就像一个字典,但是当你引用一个不存在的键而不是引发异常时,它只是创建一个默认值,在这种情况下是字典。然后我取出并删除 BrandProduct,并存储其余部分。

我认为剩下的就是将成本和价格转换为数字而不是字符串。

[修改为直接使用DictReader而不是reader]

关于python - 使用Python CSV DictReader创建多级嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12220796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com