【问题标题】:Python JSON to CSV: keys to header issuePython JSON to CSV:标题问题的关键
【发布时间】:2022-11-02 23:44:31
【问题描述】:

我正在尝试将一个很长的 JSON 文件转换为 CSV。我目前正在尝试使用下面的代码来完成此操作。

import json
import csv
 
with open('G:\user\jsondata.json') as json_file:
    jsondata = json.load(json_file)
 
data_file = open('G:\user\jsonoutput.csv', 'w', newline='')
csv_writer = csv.writer(data_file)
 
count = 0
for data in jsondata:
    if count == 0:
        header = data.keys()
        csv_writer.writerow(header)
        count += 1
    csv_writer.writerow(data.values())
 
data_file.close()

这段代码完成了将所有数据写入 CSV,但是仅将第一 JSON 行中的键用作 CSV 中的标题。这很好,但在 JSON 中还有更多的键可供使用。这会导致值混乱。我想知道是否有人可以帮助我找到一种方法来获取所有可能的标题并可能在一行不包含该键或该键的值时插入 NA 。

JSON 文件与此类似:


[

    {"time": "1984-11-04:4:00", "dateOfevent": "1984-11-04", "action": "TAKEN", "Country": "Germany", "Purchased": "YES", ...},
    {"time": "1984-10-04:4:00", "dateOfevent": "1984-10-04", "action": "NOTTAKEN", "Country": "Germany", "Purchased": "NO", ...},
    {"type": "A4", "time": "1984-11-04:4:00", "dateOfevent": "1984-11-04", "Country": "Germany", "typeOfevent": "H7", ...},
    {...},
    {...},

]

我一直在寻找可能的解决方案,但找不到任何有类似问题的人。

【问题讨论】:

    标签: python json csv


    【解决方案1】:

    您能否尝试正常阅读,然后使用 .to_csv 将其转换为 csv,如下所示:

    df = pd.read_json('G:userjsondata')
    #df = pd.json_normalize(df['Column Name']) #if you want to normalize it
    
    
    dv.to_csv('example.csv')
    

    【讨论】:

      【解决方案2】:

      如果想使用 csv 和 json 模块来执行此操作,则可以分两次执行。第一遍收集 CSV 文件的密钥,第二遍将行写入 CSV 文件。此外,必须使用 csv.DictWriter 因为不同记录中的键不同。

      import json
      import csv
      
      with open('jsondata.json') as json_file:
          jsondata = json.load(json_file)
      
      keys = []
      for data in jsondata:
          for k in data.keys():
              if k not in keys:
                  keys.append(k)
      
      with open('jsonoutput.csv', 'w', newline='') as fout:
          csv_writer = csv.DictWriter(fout, fieldnames=keys)
          csv_writer.writeheader()
          for data in jsondata:
              csv_writer.writerow(data)
      

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多