【问题标题】:Printing a dictionary to a CSV file when some keys have more than one value当某些键具有多个值时,将字典打印到 CSV 文件
【发布时间】:2015-05-18 19:09:10
【问题描述】:

我有一个 CSV 文件,我正在从中读取一些字段(列)到字典中(这样一列用作键,另一列用作值)。更准确地说,我有数字格式的键和字符串格式的值。但我这里有一个问题。在 CSV 文件中,我遇到了相同数字与多个字符串相关联的情况。因此,当我尝试将字典打印到 output.csv 文件时,它确实按照我想要的 (key:value) 格式打印它,但它忽略了键具有多个关联值的情况。据我观察,只有与该键关联的最新值被保留,旧值被覆盖。

例如: 999 测试1 999 测试1 999 测试2 999测试3

在这种情况下,只有 999:Test3 会打印在 output.csv 文件中。我需要的是,如果出现这样的情况,它应该在 output.csv 文件上打印一条消息,类似这样。

999:有多个测试

我该如何实现呢?这是我到目前为止编写的代码,用于将字典打印到输出文件。但是我需要一些帮助来合并上述期望的结果。

import csv

infile = open('input.csv',"rb")
reader = csv.reader(infile)

outfile = open('output.csv',"wb")
writer = csv.writer(outfile)

mydict = dict((rows[18],rows[19]) for rows in reader)
for key,value in mydict.items():
    writer.writerow([key,value])

infile.close()
outfile.close()

感谢任何帮助。

谢谢!

【问题讨论】:

  • 您是说在输入文件中,由于您正在读取第 18 列和第 19 列,因此第 18 列中可能存在与前一行具有相同值的行?
  • python 中的 dicts 具有唯一的键,因此您不能将超过 Test 分配给键。但是,您可以将列表分配给键。所以你可以做类似 999 [Test1, Test1, Test2, Test3] 的事情。
  • @mauve:是的,你是对的。我想识别这些行并相应地打印错误消息。
  • @lachance 是的,我会试试的

标签: python csv dictionary


【解决方案1】:

只需在已找到的密钥上保留一个标签并对其进行测试:

import csv

infile = open('input.csv', "rb")
reader = csv.reader(infile)

outfile = open('output.csv', "wb")
writer = csv.writer(outfile)

found_keys = {}
for rows in reader:
    k, v = rows[18], rows[19]
    if k in found_keys and found_keys[k] != v:
        print("found duplicate key {} with different values {} , {}".format(k, v, found_keys[k]))
    else:
        found_keys[k] = v
        writer.writerow([k, v])   

infile.close()
outfile.close()

【讨论】:

  • 如果我有这样的键和值怎么办? 999 Test1 999 Test1 999 Test1 在这种情况下,我不想打印错误消息。仅当键具有多个“唯一”值时,我才需要错误消息。
  • 谢谢@RickyA。我想我现在走在正确的轨道上。我会从那里拿走。
猜你喜欢
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多