【发布时间】:2012-08-26 14:14:27
【问题描述】:
这里的总 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 创建嵌套 dicts 的信息很少,而且那里的示例非常具体,往往不会详细说明解决方案实际有效的原因,所以作为 Python 新手,很难得出结论。
此外,输入的 csv 文件通常没有标题,但为了尝试获得此函数的工作版本,我手动插入了标题行。理想情况下,会有一些代码分配标题。
非常感谢任何帮助/方向/建议,谢谢!
【问题讨论】:
-
你有两个独立的问题:第一个是解析,第二个是把数据放入字典。我建议您先不使用 csv.DictReader 来执行此操作 - 它只是令人困惑,并且使用本机拆分功能很容易实现。接下来 - 您应该附加到字典,而不是覆盖它(当您获得现有品牌的另一个项目时)。
-
我同意@GuyAdini,你甚至不需要使用 csv 阅读器。只需手动操作,它也会为您提供更多选择。
-
使用
split代替csv非常诱人,但只有在您知道(例如)Product 绝不是“SuperUltraWidget,加拿大版”的情况下才会起作用。在所有条件相同的情况下,我认为现在学习使用csv模块会更安全。 -
即使使用 csv 库,您也必须编写代码来捕获
None并找出解决方法。 -
@GuyAdini - 感谢您的建议。为了确保我理解正确,您认为最好打开文件,遍历 (',') 上的每一行拆分,并根据索引更新字典?感谢您抽出宝贵时间提供帮助。
标签: python python-2.7 csv dictionary