python - 如何复制不同 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')
我想要实现的是将所有数据写入一个文件中,而不是根据它们的 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 允许您这样做,但它使代码非常难以理解。我建议不要在您自己的代码中这样做。
推荐阅读
- php - 传递给 Illuminate\Routing\Middleware\ThrottleRequests::addHeaders() 的参数 1 必须是
- java - Java 8 正则表达式:模式中的捕获组不匹配,但整个模式匹配
- emacs - Emacs:从文件重新加载所有缓冲区
- python - numpy 数组切片索引
- ruby-on-rails - 部署后查找应用路径
- vb.net - 带有 VarChar 对象的 OracleParameter 参数构造函数
- x86 - 如何在 Intel i7 处理器中单独禁用 L2 缓存?
- python - Python如何查看列/行格式的数据
- swift - Swift Package Manager - 对活动分支的依赖不会拉新提交
- r - 当某些值故意未知时,如何在逻辑回归中编码预测变量