【问题标题】:Parse and convert JSON to CSV解析 JSON 并将其转换为 CSV
【发布时间】:2017-05-16 22:20:36
【问题描述】:

Parsing values from a JSON file using Python? 的帮助下,我能够使用以下方法读取数据:

with open('data/data.json') as data_file:
    data_loaded = json.load(data_file)

但是,我无法进入要将其转换为 CSV 文件的下一步。示例代码:

import pandas as pd
import json 
from io import StringIO
import io
import csv
import sys

sample = {'Table': [{'AA12_Requestor_0': 'John Doe',
   'AA28_Requestor Business Unit_0': 'Manchester United',
   'AA29_Target Remediation Date_0': '2017-07-01',
   'AA29_Exception Lead_0': 'Ji Sung Park',
   'AA29_Level 1 Approver_0': 'Phil Knight',
   'AA29_Date of last WF change_0': '2017-02-12',
   'AA29_Approval Cycles_0': '1',
   'AA29_Level 2 Approver_0': 'Jae In Moon',
   'AA29_Exception Submitted Date_0': '2015-10-12',
   'AA29_Days in Awaiting Assignment_0': '0',
   'AA29_Days in Awaiting Info Sec Review_0': '0',
   'AA29_Days in Awaiting Governance Management Review_0': '2',
   'AA29_Days in Awaiting Level 1 Review - No Level 2 Rev_0': '',
   'AA29_Days from Submitted to Approved_0': '5',
   'AA29_Days from Submitted to Rejected_0': '',
   'AA29_Geography_0': None,
   'AA29_Blood Type': 'Love',
   'AA32_EX: Area_0': None,
   'AA32_Impact_0': None,
   'AA32_Rating_0': None,
   'AA32_Rating (Number)_0': '',
   'AA32_Likelihood_0': None,
   'AA32_Risk Sensitivity_0': None,
   'AA3_Description_0': 'Title: Get your job done | Norm: Be happy.\xa0 Love OS. | Blood type: Z',
   'AA39_Record ID_0': '12345',
   'AA39_Escalation Flag_0': 'No',
   'AA39_Submitted Date_0': '2015-10-15',
   'AA40_ID_0': '123',
   'AF13_Record Workflow State': 'Canceled',
   'FINDING_ID': 12345}]}

在我的 JSON 文件中有更多上述字典的迭代

我试过了:

  1. 参考http://blog.appliedinformaticsinc.com/how-to-parse-and-convert-json-to-csv-using-python/

    json_parsed = json.loads(sample)
    

    给我一​​个错误,说 JSON 对象必须是字符串而不是字典。

    TypeError: the JSON object must be str, bytes or bytearray, not 'dict'
    
  2. 试图创建csvwriter对象

    csvwriter = csv.writer(sample)
    

    给我一​​个错误提示:

    TypeError: argument 1 must have a "write" method
    
  3. 我也读过How can I convert JSON to CSV?,但我无法通过第一步,即json.loads(sample)

  4. 根据Python - JSON to CSV table? DictWriter 听起来很有趣。但不知道如何将其应用到我的任务中。

  5. pd.read_json(sample) 也期待该字符串。给出一个错误提示

    TypeError: Expected String or Unicode
    

我希望所有键都是标题(列)和行中键的所有值。

【问题讨论】:

  • 为什么需要loads/read呢?它已经加载/读取。这些东西是假设你从一个 JSON 字符串开始,而不是 Python 对象。
  • @jonrsharpe 我加载了需要转换为 csv 的实际文件。但是当我尝试进行下一步时,我使用了以下步骤: csvwriter = csv.writer(data_loaded) 它给了我一个错误,说 TypeError: argument 1 must have a "write" 方法。我的实际数据与上面的示例具有相同(错误)的 json 格式,我不知道如何在 python 中修复数据结构...
  • csv.writer 需要一个 file,你为什么要传递 data?!
  • @jonrsharpe 对不起新手错误。我尝试了在其他问题中可以看到的所有方法,但没有阅读所有问题的文档。
  • 对我的问题投反对票的任何理由?只是这样我下次可以提出更好的格式问题

标签: json python-3.x csv data-conversion


【解决方案1】:

sample 不是 JSON 对象。

pd.read_json 会失败。

pd.read_json 接受一个指向 JSON 文档的字符串。您正在传递一个 dict 对象。

尝试传递这个:

sample = {'AA12_Requestor_0': 'John Doe',
   'AA28_Requestor Business Unit_0': 'Manchester United',
   'AA29_Target Remediation Date_0': '2017-07-01',
   'AA29_Exception Lead_0': 'Ji Sung Park',
   'AA29_Level 1 Approver_0': 'Phil Knight',
   'AA29_Date of last WF change_0': '2017-02-12',
   'AA29_Approval Cycles_0': '1',
   'AA29_Level 2 Approver_0': 'Jae In Moon',
   'AA29_Exception Submitted Date_0': '2015-10-12',
   'AA29_Days in Awaiting Assignment_0': '0',
   'AA29_Days in Awaiting Info Sec Review_0': '0',
   'AA29_Days in Awaiting Governance Management Review_0': '2',
   'AA29_Days in Awaiting Level 1 Review - No Level 2 Rev_0': '',
   'AA29_Days from Submitted to Approved_0': '5',
   'AA29_Days from Submitted to Rejected_0': '',
   'AA29_Geography_0': None,
   'AA29_Blood Type': 'Love',
   'AA32_EX: Area_0': None,
   'AA32_Impact_0': None,
   'AA32_Rating_0': None,
   'AA32_Rating (Number)_0': '',
   'AA32_Likelihood_0': None,
   'AA32_Risk Sensitivity_0': None,
   'AA3_Description_0': 'Title: Get your job done | Norm: Be happy.\xa0 Love OS. | Blood type: Z',
   'AA39_Record ID_0': '12345',
   'AA39_Escalation Flag_0': 'No',
   'AA39_Submitted Date_0': '2015-10-15',
   'AA40_ID_0': '123',
   'AF13_Record Workflow State': 'Canceled',
   'FINDING_ID': 12345}

data = pd.DataFrame(sample, index=[0]) # Only one row so index has a length of 1

从那里您可以执行 ```data.to_csv("path/to/out/file.csv")`` 将 JSON 对象传递给 csv。

【讨论】:

  • 示例代码有效。但看起来我需要更改数据源,它以 {'Table': [{'FA2891_Requestor_0': 'Michael Pollock', .... 并以 }]} 开头,这在小样本中很容易更改数据,但我有一个更大的文件(我认为是 json 但不是 json)有同样的问题。有没有办法可以对数据进行切片,使其成为 json 文件? {'Table': [{ 并以下面 }]} 结尾
猜你喜欢
  • 2015-10-18
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多