如何将查询结果格式化为CSV?

How to format query results as CSV?

提问人:Taylor Risner 提问时间:4/16/2022 最后编辑:Taylor Risner 更新时间:4/18/2022 访问量:109

问:

我的目标是:自动执行查询的操作,并将结果输出到 csv 中。

我已经成功地使用Python获取了查询结果(这是我用Python进行的第一个项目)。我正在尝试将这些结果格式化为 csv,但完全丢失了。它基本上只是创建 2 个巨大的行,所有数据都没有解析出来。附加了.txt和.csv结果(我通过简单地调用查询并输入“文件名>结果.txt”或“文件名>结果.csv”来获得这些结果。

txt 结果:等等(重复 100 行)。.{'data': {'get_result': {'job_id': None, 'result_id': '72a17fd2-e63c-4732-805a-ad6a7b980a99', '__typename': 'get_result_response'}}} {'data': {'query_results': [{'id': '72a17fd2-e63c-4732-805a-ad6a7b980a99', 'job_id': '05eb2527-2ca0-4dd1-b6da-96fb5aa2e67c', 'error': None, 'runtime': 157, 'generated_at': '2022-04-07T20:14:36.693419+00:00', 'columns': ['project_name', 'leaderboard_date', 'volume_30day', 'transactions_30day', 'floor_price', 'median_price', 'unique_holders', 'rank', 'custom_sort_order'], '__typename': 'query_results'}], 'get_result_by_result_id': [{'data': {'custom_sort_order': 'AA', 'floor_price': 0.375, 'leaderboard_date': '2022-04-07', 'median_price': 343.4, 'project_name': 'Terraforms by Mathcastles', 'rank': 1, 'transactions_30day': 2774, 'unique_holders': 2179, 'volume_30day': 744611.6252}, '__typename': 'get_result_template'}, {'data': {'custom_sort_order': 'AB', 'floor_price': 4.69471, 'leaderboard_date': '2022-04-07', 'median_price': 6.5, 'project_name': 'Meebits', 'rank': 2, 'transactions_30day': 4153, 'unique_holders': 6200, 'volume_30day': 163520.7377371168}, '__typename': 'get_result_template'},

python-3.x csv etl 数据操作

评论

0赞 Tranbi 4/16/2022
你试过吗?特别是from_dictto_csvjson_normalize也可能引起人们的兴趣......pandas
0赞 martineau 4/16/2022
CSV 数据格式不支持嵌套数据结构。可以将其视为简单的 2D 数组或数据表。我建议你使用一些其他格式,比如JSON。
0赞 martineau 4/16/2022
请不要发布指向站外资源的链接,尤其是其他人无法访问的链接。

答:

0赞 NickP 4/16/2022 #1

您似乎在 python 字典中拥有数据。谷歌表格显示访问被拒绝,所以我看不到全部数据。

但从本质上讲,您希望将字典数据转换为 csv 文件。

从根本上说,您可以使用这样的代码来到达您需要的地方。对于您的示例,您需要向下钻取到行的实际位置。

import csv
new_path = open("mytest.csv", "w")
file_dictionary = {"oliva":199,"james":145,"potter":187}

z = csv.writer(new_path)
for new_k, new_v in file_dictionary.items():
    z.writerow([new_k, new_v])

new_path.close()

本指南应该对您有所帮助。https://pythonguides.com/python-dictionary-to-csv/

0赞 goodvibrations32 4/16/2022 #2

如果我正确理解您的问题,您应该使用结果构建数据帧格式,然后以 .csv 格式保存数据帧。Pandas 库实用且易于使用。

评论

0赞 Community 4/16/2022
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 martineau 4/16/2022 #3

文本字符串实际上包含两个由空格字符分隔的字典。
以下是其中每个内容的格式化版本:
results

dict1 = {'data': {'get_result': {'job_id': None,
                                 'result_id': '72a17fd2-e63c-4732-805a-ad6a7b980a99',
                                 '__typename': 'get_result_response'}}}

dict2 = {'data': {'query_results': [{'id': '72a17fd2-e63c-4732-805a-ad6a7b980a99',
                                     'job_id': '05eb2527-2ca0-4dd1-b6da-96fb5aa2e67c',
                                     'error': None,
                                     'runtime': 157,
                                     'generated_at': '2022-04-07T20:14:36.693419+00:00',
                                     'columns': ['project_name',
                                                 'leaderboard_date',
                                                 'volume_30day',
                                                 'transactions_30day',
                                                 'floor_price',
                                                 'median_price',
                                                 'unique_holders',
                                                 'rank',
                                                 'custom_sort_order'],
                                     '__typename': 'query_results'}],
                  'get_result_by_result_id': [{'data': {'custom_sort_order': 'AA',
                                                        'floor_price': 0.375,
                                                        'leaderboard_date': '2022-04-07',
                                                        'median_price': 343.4,
                                                        'project_name': 'Terraforms by Mathcastles',
                                                        'rank': 1,
                                                        'transactions_30day': 2774,
                                                        'unique_holders': 2179,
                                                        'volume_30day': 744611.6252},
                                               '__typename': 'get_result_template'},
                                              {'data': {'custom_sort_order': 'AB',
                                                        'floor_price': 4.69471,
                                                        'leaderboard_date': '2022-04-07',
                                                        'median_price': 6.5,
                                                        'project_name': 'Meebits',
                                                        'rank': 2,
                                                        'transactions_30day': 4153,
                                                        'unique_holders': 6200,
                                                        'volume_30day': 163520.7377371168},
                                               '__typename': 'get_result_template'},
                                             ]}}

(顺便说一句,我使用 pprint 模块格式化它们。在处理这类问题时,这通常是一个很好的第一步——这样你就知道你在处理什么。

完全忽略第一个,忽略第二个中除了重复数据之外的所有数据 - 我认为这是您真正想要的 - 您可以从列表中的嵌套字典值创建一个 CSV 文件。以下是使用 csv 完成此操作的方法。DictWriter 类:dict2['data']['get_result_by_result_id']

import csv
from pprint import pprint  # If needed.


output_filepath = 'query_results.csv'

# Determine CSV fieldnames based on keys of first dictionary.
fieldnames = dict2['data']['get_result_by_result_id'][0]['data'].keys()

with open(output_filepath, 'w', newline='') as outp:
    writer = csv.DictWriter(outp, delimiter=',', fieldnames=fieldnames)
    writer.writeheader()  # Optional.

    for result in dict2['data']['get_result_by_result_id']:
#        pprint(result['data'], sort_dicts=False)
        writer.writerow(result['data'])

print('fini')

使用测试数据,下面是它创建的文件的内容:Using the test data, here's the contents of the file created'query_results.csv'

custom_sort_order,floor_price,leaderboard_date,median_price,project_name,rank,transactions_30day,unique_holders,volume_30day
AA,0.375,2022-04-07,343.4,Terraforms by Mathcastles,1,2774,2179,744611.6252
AB,4.69471,2022-04-07,6.5,Meebits,2,4153,6200,163520.7377371168