【问题标题】:Extract json fields and write them into a csv with python提取json字段并使用python将它们写入csv
【发布时间】:2023-04-07 23:05:01
【问题描述】:

我有一个包含多个字段的非常大的 json,我想只提取其中一些,然后将它们写入 csv。

这是我的代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import json

import csv

data_file = open("book_data.json", "r")
values = json.load(data_file)
data_file.close()

with open("book_data.csv", "wb") as f:
    wr = csv.writer(f)
    for data in values:
         value = data["identifier"]
         value = data["authors"]
         for key, value in data.iteritems():
               wr.writerow([key, value])

它给了我这个错误:

File "json_to_csv.py", line 22, in <module>
wr.writerow([key, value])
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 8: ordinal not in range(128)

但是我在上面给出了utf-8编码,所以我不知道那里出了什么问题。

谢谢

【问题讨论】:

标签: python json csv


【解决方案1】:

您需要对数据进行编码:

wr.writerow([key.encode("utf-8"), value.encode("utf-8")])

区别相当于:

In [8]: print u'\u2019'.encode("utf-8")
’

In [9]: print str(u'\u2019')
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-9-4e3ad09ee31b> in <module>()
----> 1 print str(u'\u2019')

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 0: ordinal not in range(128)

如果你有字符串、列表和值的混合,你可以使用 issinstance 来检查你有什么,如果你有一个列表迭代和编码:

with open("book_data.csv", "wb") as f:
    wr = csv.writer(f)
    for data in values:
         for key, value in data.iteritems():
               wr.writerow([key, ",".join([v.encode("utf-8") for v in value]) if isinstance(value, list) else value.encode("utf8")])

只写creator, contributoridentifier这三列,只需使用键拉取数据:

import csv

with open("book_data.csv", "wb") as f:
    wr = csv.writer(f)
    for dct in values:
        authors = dct["authors"]
        wr.writerow((",".join(authors["creator"]).encode("utf-8"),
                     "".join(authors["contributor"]).encode("utf-8"),
                     dct["identifier"].encode("utf-8")))

【讨论】:

  • 谢谢!这行得通,但现在它给了我:文件“json_to_csv.py”,第 22 行,在 wr.writerow([key.encode("utf-8"), value.encode("utf-8")] ) AttributeError: 'list' 对象没有属性 'encode'
  • 你有一些列表值吗?
  • 是的,我现在退出比赛,但我会在重新开始时进行编辑。
  • 很酷,那么对于多个作者、贡献者,您将有一个逗号分隔的字符串,当您阅读文件时,该字符串将被解析为单个值。
  • 非常感谢!!
猜你喜欢
  • 2019-12-13
  • 2012-07-25
  • 1970-01-01
  • 2020-10-27
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 2015-06-26
相关资源
最近更新 更多