【问题标题】:Python: Is there a way to update the keys (columns) of a DictWriter before calling writerow()?Python:有没有办法在调用 writerow() 之前更新 DictWriter 的键(列)?
【发布时间】:2015-06-08 07:04:02
【问题描述】:

csv.Dictwriter 被实例化为:

 class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

fieldsnames 是一个键序列,或者在我的例子中是一个字典。

这是我的问题;在用某个 dict 实例化 DictWriter 之后,我希望在调用 writerow() 之前删除 fieldnames 的一些键(以及扩展的值)。由于我不会进入的原因,我只能告诉代码在实例化DictWriter 之后要删除哪些键。 Dict 只有 3 种方法:

writerheader
writerow
writerows

.. 这些都没有任何帮助。根据我的测试,似乎DictWriter被实例化时,它根据fieldnames设置了csv-to-be的列名。实例化后对fieldnames 所做的任何更改都不会影响将生成的列标题。因为 DictWriter 在实例化时定义了列,所以我是否坚持这些?或者有没有办法解决这个问题?

【问题讨论】:

  • 我认为您可以使用 csv.writer 并遍历所有行进行写入,以便在写入之前完全控制每一行及其值。
  • @VikasNehaOjha 但是由于每一行都必须具有与其他行相同的键(列名),所以控制每一行如何满足我的目的?我希望摆脱列本身,无论任何给定行的列值如何。
  • 您能告诉我们您是如何构建要迭代的数据的吗?这意味着,如何在代码中编写行结构。我假设它是一个字典列表并发布答案。
  • @VikasNehaOjha 我无法编辑我的帖子。要写入 CSV 的数据的结构与您在此处看到的非常相似:gist.github.com/Pyderman/2263d6887b9963d3d1ca 在第 297 行和第 306 行之间,我希望删除一些列,即我知道它们的键匹配值的那些列某个字符串。它们不是为电子邮件标题中的字段创建的列。相反,它们是我在第 297 行实例化 DictWriter 之前创建的。

标签: python list csv dictionary instantiation


【解决方案1】:

假设你有一个类似的字典 -

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

那么你可以使用 csv.writer 如下:

f = open('abc.csv', 'wb')
csv_writer = csv.writer(f, dialect=csv.excel, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)

for row in rows:
    csv_writer.writerow([row['b'], row['c'])  # Assuming we dont want keys 'a' and 'b' to be written
f.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多