如何在大型数据集中将未知密钥写入CSV?

时间:2017-09-29 20:53:08

标签: python csv

我目前正在开发一个脚本,该脚本将从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引入了一个全新的密钥。

我考虑过的选项:

  • 每当遇到新密钥时,请读取输出CSV,将新密钥附加到标头,然后在前一行中附加逗号。这导致了文件I / O的TON,我希望避免这种情况。
  • 不是写入CSV,而是将原始JSON写入文件。同时,在迭代数据时建立所有已知密钥的列表。一旦我完成查询API,迭代我编写的JSON文件,并使用我构建的列表编写CSV。这导致对数据进行2次迭代,并且感觉不必要地复杂。
  • 预先硬编码潜在密钥列表。出于多种原因,这种方法是不可能的。

这些解决方案对我来说都不是特别优雅,这引出了我的问题。有没有更好的方法来解决这个问题?我忽略了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

选项1和2似乎都合理。

在您创建CSV时,CSV是否需要有效且可读?如果没有,你可以在完成从API读取后的一次传递中删除缺少的列(这可能就像两种方法的组合)。如果你这样做,你可能不得不在第一遍中使用常规csv.writer而不是csv.DictWriter,因为你的列定义会在你写作时增长。

要记住的一件事 - 如果预期整个文件很大(例如,不适合内存),那么您的解决方案可能需要使用流式处理方法,这很容易使用CSV但很简单JSON。您可能还希望研究JSON的替代格式以获取中间数据(例如XML,BSON等)。