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

如何复制不同JSON文件的主体并使用Python将它们全部写入一个文件?,python,json,avro,Python,Json,Avro,我试图解析文件目录中的一些Avro文件(包含JSON),并获取“Body”数据,然后将其写入一个名为“AllBodyData.CSV”的CSV文件 我发现了这个函数示例,它解析所有主体字段,并根据JSON主体内的id创建不同的CSV文件 这在主函数中循环,文件列表中的文件使用 def processBlob(filename): reader = DataFileReader(open(filename, 'rb'), DatumReader()) #Convert avro to j

我试图解析文件目录中的一些Avro文件(包含JSON),并获取“Body”数据,然后将其写入一个名为“AllBodyData.CSV”的CSV文件

我发现了这个函数示例,它解析所有主体字段,并根据JSON主体内的id创建不同的CSV文件

这在主函数中循环,文件列表中的文件使用


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')

学分:

我试图实现的是只在一个文件中写入所有数据,而不是根据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()+'\\'+'所有数据'+'.csv'
deviceFile=open(文件名“a”)
对于dict.keys()中的设备:
对于dict[设备]中的r:
deviceFile.write(“,”.join([str(r[x]),用于r.keys()中的x)+'\n')
因此,完整的代码片段如下所示:

def processBlob(文件名):
reader=DataFileReader(打开(文件名'rb'),DatumReader())#将avro转换为json
dict={}
在读卡器中阅读:
已解析的_json=json.load(读取[“Body”])
如果解析的_json中没有“id”:
返回
如果未在dict中解析\u json['id']:
列表=[]
dict[parsed_json['id']]=list
其他:
list=dict[parsed_json['id']]
追加(已解析的_json)
reader.close()
filename=os.getcwd()+'\\'+'所有\u数据'+'.csv'
deviceFile=open(文件名“a”)
对于dict.keys()中的设备:
对于dict[设备]中的r:
deviceFile.write(“,”.join([str(r[x]),用于r.keys()中的x)+'\n')

另一方面,微软的代码片段确实很难阅读,因为它们做了类似于
dict={}
的事情,这会覆盖内置名称
dict
。Python允许您这样做,但它使代码很难理解。我建议您不要在自己的代码中这样做。

为什么不使用
avro
库将字符串加载到适当的
json
中,该库将字符串加载到适当的格式中?首先,您可以使用
print()
查看变量中的值-它被称为
“打印调试”
。也许你不应该使用其他来源的代码,而是从头开始编写,然后你就会知道这些代码在做什么。然后一步一步地编写代码-首先只读取文件并显示它,然后剪切您需要的元素,然后将其添加到某个列表中,在这段代码中,我看到了一个很大的错误——在第一个循环中,您一次又一次地创建
list=…
,但您从未将
parsed_json
添加到
dict
中,您以后将使用它来写入数据。如果要保存在一个文件中,最好使用相同的名称
filename=“AllBodyData.csv”