【发布时间】:2019-10-26 05:36:43
【问题描述】:
我每天收到大约 50 个 JSON 文件,我需要将它们转换/合并为单个 CSV 文件。我是编程和 Python 的新手。我已经能够获得一个 JSON 文件以正确转换为 CSV。尽管试图创建一个循环来读取目录中的新文件,但我已经挣扎了好几天。 对于如何读取在过去 24 小时内创建的目录中的所有 JSON 文件的任何帮助,我们将不胜感激。
我正在附上我目前按名称读取单个文件的工作代码。
import json
import csv
def get_leaves(item, key=None):
if isinstance(item, dict):
leaves = {}
for i in item.keys():
leaves.update(get_leaves(item[i], i))
return leaves
elif isinstance(item, list):
leaves = {}
for i in item:
leaves.update(get_leaves(i, key))
return leaves
else:
return {key: item}
with open('test2.json') as f_input:
json_data = json.load(f_input)
fieldnames = set()
for entry in json_data:
fieldnames.update(get_leaves(entry).keys())
with open('output.csv', 'a', newline='') as f_output:
csv_output = csv.DictWriter(f_output, fieldnames=sorted(fieldnames))
csv_output.writeheader()
csv_output.writerows(get_leaves(entry) for entry in json_data)
【问题讨论】:
-
请edit您的问题并描述多个文件的问题。
-
您正在以 append 模式打开 output.csv。如果您依次对每个 JSON 文件运行脚本,它基本上会执行您想要的操作。并不是说它很理想,但肯定比花几天时间修复它要好。
-
多个文件的一个问题是
writeheader()只需要第一个文件。此外,如果要获取过去 24 小时内创建的所有文件,则必须首先获取当前日期和时间,并将其与目录中 CSV 文件的创建日期进行比较。 -
@martineau 是的,好电话。需要抑制文件 2-N 上的 CSV 标头。
-
@martineau 我无法创建一个 for 循环来循环浏览当前目录中的所有文件。我试图在 glob.glob("*.json"): with open(f, "r") as infile: result.append(json.load(infile)) 中运行类似 for f 的东西来读取所有文件,但是那没有用。我也不确定如何在 2-N 个文件中保留 CSV 的标题。