首页 > 解决方案 > 如何复制不同 JSON 文件的正文并使用 Python 将它们全部写入一个文件?

问题描述

我正在尝试在我的文件目录中解析一些 Avro 文件(包含 JSON)并获取“Body”数据,然后我可以将其写入一个名为“AllBodyData.csv”的 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 = {}因为不可散列而不允许使用,那我应该如何进行?

标签: pythonjsonavro

解决方案


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

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 允许您这样做,但它使代码非常难以理解。我建议不要在您自己的代码中这样做。


推荐阅读