【问题标题】:Read multiple JSON files and convert data to single CSV file读取多个 JSON 文件并将数据转换为单个 CSV 文件
【发布时间】: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 的标题。

标签: python json csv


【解决方案1】:

假设您的代码中有一个名为 convert_file_to_csv(path) 的函数将文件传递为 csv 格式,那么您可以创建如下例程:


import os

files = os.listdir()
for path in files:
    convert_file_to_csv(path)

现在唯一认为它丢失的是您在每次调用 convert_file_to_csv 时添加标题,在这种情况下,您应该检查 .csv 文件是否是新文件。并且仅在标题是新的时才添加标题。

您可以将已经移植的文件保存在控制文件或日志文件中,以了解文件的名称或上次更新的时间。

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2018-11-05
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多