【问题标题】:Generate CSV with multiple values in Python在 Python 中生成具有多个值的 CSV
【发布时间】:2014-06-03 08:29:17
【问题描述】:
{'id': '/en/45_2006', 'type': '/film/film', 'directed_by': ['Gary Lennon'], 'genre': ['Black comedy', 'Thriller', 'Psychological thriller', 'Indie film', 'Action Film', 'Crime Thriller', 'Crime Fiction', 'Drama'], 'name': '.45', 'initial_release_date': '2006-11-30'}

我有一个这样的字典列表,我想从中创建一个 CSV 文件。

以下代码似乎可以正常工作。但是当字典对一个键(列表)有多个值时,它会按原样写入整个列表 -

    keys = ['name', 'directed_by', 'genre', 'type', 'id', 'initial_release_date']
    with open('film.csv', 'w', newline='', encoding='utf8') as csvfile:
        dict_writer = csv.DictWriter(csvfile, keys)
        dict_writer.writeheader()
        dict_writer.writerows(filmlist)

鉴于某些键在列表中有多个值并且我想写所有这些值,我应该如何编写 CSV 文件。

【问题讨论】:

  • 您想为流派列表中的每个流派复制每一行吗?也就是说,您是否希望每部电影有多个条目,每个条目只有一个流派?
  • 不,我不想重复行。我希望它在同一行中,并且能够使用另一个分隔符来区分多个值

标签: python csv python-3.x


【解决方案1】:

这是 jonrsharpes 答案的扩展,为您的列表处理一个特殊的分隔符:

special_delim = '%'
for k, v in d.items():
     if isinstance(v, list):
        d[k] = special_delim.join(v)

【讨论】:

  • 您可能需要special_delim.join(map(str, v)) 以确保非字符串列表内容不会破坏代码
  • 这也是我做过的。看起来你不能在 1 go 中完成它。所以这应该是可以实现的方式。
  • 你是对的。在问题描述中,所有类型都是字符串,这是针对任意类型的更通用的解决方案。但是,如果保证只包含字符串,则不需要映射所有字符串。
【解决方案2】:

您可以先将所有列表转换为字符串:

for k, v in d.items():
    if isinstance(v, list):
        d[k] = str(v)

当您重新读取csv 文件时,使用ast.literal_eval 检索列表。

【讨论】:

  • 看起来这正是默认实现所做的。如果我将其读回 python,您的解决方案将起作用。但我需要能够通过另一个 CSV 解析器将其拆分为多个值
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多