python - 将多列 csv 文件读取到嵌套字典
问题描述
我正在尝试从 csv 文件中读取数据并将数据存储在嵌套字典中。
CSV file content
Type, ID, Frequency
Advanced,AAA,30 secs
Advanced,AAA,60 secs
Advanced,BBB,30 secs
Basic,CCC,30 secs
Basic,CCC,60 secs
Basic,DDD,30 secs
Expected output where the 'type' is the higher level key with the values as another dictionary with the ID and frequency as the key/value pair.
{'Advanced': {'AAA':['30 secs', '60 secs'], 'BBB':['30 secs']}, 'Basic': {'CCC':['30 secs', '60 secs'], 'DDD':['30 secs']}}
通过两列,我可以使用 defaultdict 容器来工作。
symbols = co.defaultdict(list)
with open(filename, 'r') as f:
lines = csv.DictReader(f)
for line in lines:
print(line)
symbols[line['Type']].append(line['ID'])
解决方案
您可以dict.setdefault
改用:
symbols = {}
with open(filename, 'r') as f:
for row in csv.DictReader(f, skipinitialspace=True):
symbols.setdefault(row['Type'], {}).setdefault(row['ID'], []).append(row['Frequency'])
symbols
变成:
{'Advanced': {'AAA': ['30 secs', '60 secs'], 'BBB': ['30 secs']}, 'Basic': {'CCC': ['30 secs', '60 secs'], 'DDD': ['30 secs']}}
或者,如果您更喜欢使用collections.defaultdict
,则应改为创建symbols
ofdefaultdict
列表defaultdict
:
symbols = defaultdict(lambda: defaultdict(list))
for row in csv.DictReader(f, skipinitialspace=True):
symbols[row['Type']][row['ID']].append(row['Frequency'])
推荐阅读
- java - 线程“main”java.lang.NumberFormatException 中的异常:对于非空或空的输入字符串
- python - 根据列的数据类型删除数据框中的行
- javascript - 反应滚动到一个没有反应路由器和最基本代码的组件
- javascript - 当我尝试在我的 chrome 扩展中使用 https://apis.google.com/js/api.js 时出错
- java - 包名无效
- android - 如何使用 OpenGL ES 着色器转换 rgbaToYuv 然后渲染到 ImageReader 的表面
- c++ - 我们可以将 c++ 标准编译与 MSVC 混合使用吗?
- python - python - 如何在python中的空位置将字符串拆分为长度相等的0对?
- javascript - 如果使用量角器不存在元素,如何使测试失败
- c# - 如何在 C# 中逐行读取 CMD 输出结果