如何复制不同 JSON 文件的主体并将它们全部写入一个 Python 文件?

How can I copy the body of different JSON files and write them all to one file with Python?

我正在尝试解析我的文件目录中的一些 Avro 文件(其中包含 JSON)并获取“正文”数据,然后我可以将其写入一个名为“AllBodyData.csv".

我发现了这个函数示例,它解析所有正文字段并根据 JSON 正文中的 ID 创建不同的 CSV 文件。

这是在主函数中循环的 for file in file_list


def processBlob(filename):
    reader = DataFileReader(open(filename, 'rb'), DatumReader()) #Convert avro to json
    dict = {}
    for reading in reader:
        parsed_json = json.loads(reading["Body"])
        if not 'id' in parsed_json:
            return
        if not parsed_json['id'] in dict:
            list = []
            dict[parsed_json['id']] = list
        else:
            list = dict[parsed_json['id']]
            list.append(parsed_json)
    reader.close()
    for device in dict.keys():
        filename = os.getcwd() + '\' + str(device) + '.csv'
        deviceFile = open(filename, "a")
        for r in dict[device]:
            deviceFile.write(",".join([str(r[x]) for x in r.keys()])+'\n')

来源:https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-capture-python#create-a-python-script-to-read-your-capture-files

我想要实现的是将所有数据写入一个文件中,而不是根据它们的 ID 将它们分开。

我想到了这样的事情


def processBlob(filename):
    reader = DataFileReader(open(filename, 'rb'), DatumReader())
    dict = {}
    for reading in reader:
        parsed_json = json.loads(reading["Body"])
            list = dict[parsed_json]
            list.append(parsed_json)
    reader.close()
    for device in dict.keys():
        filename = os.getcwd() + '\' + AllBodyData + '.csv'
        deviceFile = open(filename, "a")
        for r in dict[device]:
            deviceFile.write(",".join([str(r[x]) for x in r.keys()])+'\n')
            

如果我不能使用 dict = {} 因为它不可哈希,那么我应该如何进行?

如果唯一的问题是原始代码块生成了单独的文件,而您想要一个文件,那么您可以将原始代码段的底部更改为以下内容:

filename = os.getcwd() + '\' + 'all_data' + '.csv'
deviceFile = open(filename, "a")
for device in dict.keys():
    for r in dict[device]:
        deviceFile.write(",".join([str(r[x]) for x in r.keys()])+'\n')

所以完整的代码片段如下所示:

def processBlob(filename):
    reader = DataFileReader(open(filename, 'rb'), DatumReader()) #Convert avro to json
    dict = {}
    for reading in reader:
        parsed_json = json.loads(reading["Body"])
        if not 'id' in parsed_json:
            return
        if not parsed_json['id'] in dict:
            list = []
            dict[parsed_json['id']] = list
        else:
            list = dict[parsed_json['id']]
            list.append(parsed_json)
    reader.close()
    filename = os.getcwd() + '\' + 'all_data' + '.csv'
    deviceFile = open(filename, "a")
    for device in dict.keys():
        for r in dict[device]:
            deviceFile.write(",".join([str(r[x]) for x in r.keys()])+'\n')

附带说明一下,Microsoft 的代码片段真的很难读,因为它们会执行 dict = {} 之类的操作,这会覆盖内置名称 dict。 Python 允许你这样做,但它使代码很难理解。我建议不要在您自己的代码中这样做。