【问题标题】:python3 csv with duplicate keys + python defaultdict带有重复键的python3 csv + python defaultdict
【发布时间】:2016-03-10 19:41:56
【问题描述】:

我有一个 csv 文件,其中包含很多序列号和材料编号,例如:如下所示(我只需要前 2 列,即序列号和底盘,不需要其余部分)。

serial          chassis      type   date
ZX34215         Test         XX     YY
ZX34215         final-001    XX     YY
AB30000         Used         XX     YY
ZX34215         final-002    XX     YY

我有下面的 sn-p 它将所有序列号和材料号放入字典中,但这里重复键被消除并捕获最新的序列号。

工作代码

import sys
import csv 
with open('file1.csv', mode='r') as infile:
        reader = csv.reader(infile)
        mydict1 = {rows[0]:rows[1] for rows in reader}
        print(mydict1)

我还需要捕获具有相应值的重复键,但它失败了。我使用了 python defaultdict,看起来我在这里错过了一些东西。

不工作

from collections import defaultdict
with open('file1.csv',mode='r') as infile:
    data=defaultdict(dict)
    reader=csv.reader(infile)
    list_res = list(reader)
    for row in reader:
        result=data[row[0]].append(row[1])
        print(result)

有人可以纠正我将重复的键捕获到字典中吗?

【问题讨论】:

标签: python python-2.7 python-3.x


【解决方案1】:

您需要将列表传递给您的defaultdict 而不是dict

data=defaultdict(list)

此外,您不需要将 reader 对象转换为列表,为了对其进行迭代,您也不应该在每次迭代中将附加片段分配给变量:

data=defaultdict(list)
with open('file1.csv') as infile:
    reader=csv.reader(infile)
    for row in reader:
        try:      
            data[row[0]].append(row[1])
        except IndexError:
            pass
    print(data)

【讨论】:

  • 嗨,我有很多列,我正在考虑,只需要考虑 csv 中的前 2 列(串行和机箱),所以在这种情况下,对于我的实际 csv 文件,我得到以下错误:对于 col1,阅读器中的 col2:ValueError:要解包的值太多(预期为 2)
  • @VinodHC 这是因为您的行没有相同数量的项目。您可以使用try-except 表达式来处理错误。
  • 嗨,我在 csv 文件中有一些空的序列号行,我得到以下错误,如何忽略这个并继续:对于阅读器中的行:_csv.Error: line contains NULL byte
猜你喜欢
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多