我目前正在开发一个脚本,该脚本将从REST API查询数据,并将结果值写入CSV。数据集可能包含数十万条记录,但它以100个条目的形式返回数据。我的目标是在CSV中包含每个条目的每个键。
到目前为止(这是针对此问题的简化结构):
import csv
resp = client.get_list()
while resp.token:
my_data = resp.data
process_data(my_data)
resp = client.get_list(resp.token)
def process_data(my_data):
#This section should write my_data to a CSV file
#I know I can use csv.dictwriter as part of the solution
#Notice that in this example, "fieldnames" is undefined
#Defining it is part of the question
with open('output.csv', 'a') as output_file:
writer = csv.DictWriter(output_file, fieldnames = fieldnames)
for element in my_data:
writer.writerow(element)
问题:每个条目不一定具有相同的密钥。后来的条目缺少一把钥匙并不是什么大不了的事。我的问题是,例如,条目364引入了一个全新的密钥。
我考虑过的选项:
这些解决方案对我来说都不是特别优雅,这引出了我的问题。有没有更好的方法来解决这个问题?我忽略了一些明显的东西吗?
答案 0 :(得分:1)
选项1和2似乎都合理。
在您创建CSV时,CSV是否需要有效且可读?如果没有,你可以在完成从API读取后的一次传递中删除缺少的列(这可能就像两种方法的组合)。如果你这样做,你可能不得不在第一遍中使用常规csv.writer
而不是csv.DictWriter
,因为你的列定义会在你写作时增长。
要记住的一件事 - 如果预期整个文件很大(例如,不适合内存),那么您的解决方案可能需要使用流式处理方法,这很容易使用CSV但很简单JSON。您可能还希望研究JSON的替代格式以获取中间数据(例如XML,BSON等)。