【问题标题】:Adding scrip to export python result from json to excel or csv file添加脚本以将 python 结果从 json 导出到 excel 或 csv 文件
【发布时间】:2019-10-28 08:26:17
【问题描述】:

我是 Python 世界的新手,非常抱歉。我正在研究从 API 下载的一组时间序列。这些数据已打印为 JSON 文件(如下面的代码所示)。但是,如何将这些数据从 JSON 转换为 EXCEL 或 CSV?

以下是我使用的:

import requests
payload = "{\"startDate\": 20190930, \"endDate\": 20191018, \"tags\":[\"PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG\"]}"
headers = {
'content-type': "application/json",
'accept': "application/json",
'authorization': "Bearer AAIkOWNmNGVjMzctYTg5MC00YjhiLWE4MTEtNmE4ZDUzMzU1OWVlGUDsir"
}
proxyDict = {"http": "http://webproxy.payment.nsroot.net:8080/", "https": "http://payment.nsroot.net:8080/"}
r = requests.post(url="https://payment.com/data?client_id=9cf4ec37-a890-4b8b-a811-6a8d533559ee", data=payload, headers=headers, proxies=proxyDict)
print(r.json())

以下是上述代码提供的结果。

{'频率': 'DAILY', '正文': {'PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG': {'x': [20190930, 20191001, 20191002, 20191003, 20191004, 20191007, 20191008, 201910009, 201910009, , 20191011, 20191014, 20191015, 20191016, 20191017, 20191018], 'c':[ [60.0392, 60.0391, 60.0391, 60.0391, 60.0391, 60.0391, 60.0391, 60.0391, 60.0391, 60.0391, 60.0391, 60.039, 60.039, 60.039, 60.039] ][1], 'type': 'SERIES'}}, 'status': 'OK'}

您能告诉我如何将其转换为 csv 文件吗?其中 A 列是 (yyyymmdd) 中的日期,B 列是如下值>

日期值 20190930 60.0392 ... ... 20191018 60.039

谢谢。

【问题讨论】:

  • 请分享返回的 JSON 和所需 CSV 数据的示例。
  • 嗨@balderman,下面是打印的结果。{'frequency': 'DAILY', 'body': {'PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG': {'x': [ 20190930、20191001、20191002、20191003、20191004、20191007、20191008、20191008、20191009、20191010、20191011、20191011、20191014、20191015、20191016、20191016、20191017、20191017、20191018],'C': 37.56, 37.56, 37.56, 37.5599, 37.5599, 37.5598, 37.5598, 37.5597], 'type': 'SERIES'}}, 'status': 'OK'}
  • 对于 CSV 文件,我正在考虑将其保存为如下格式:A 列(日期),B 列(值),工作表名称为 PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG
  • 大家好,我已经更新了我的问题,这样每个人都会更清楚。希望你的好意。

标签: python json csv


【解决方案1】:
result = list(zip(test['body']['PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG']['x'], test['body']['PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG']['c']))

import csv
with open('PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG', 'w', newline='') as csvfile:
    fieldnames = ['Date', 'values']
    writer = csv.writer(csvfile, delimiter=',',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(fieldnames)
    for row in result:
        writer.writerow(row)

如果您需要转换为带有工作表名称的excel,则代码如下。

import pandas as pd

df = pd.DataFrame(result, columns=['Date', 'values'])

df.to_excel('file.xlsx', sheet_name='PAYMENT.REIMBURSEMENT.1Y.BLOOMBERG', index=False)

【讨论】:

    【解决方案2】:

    首先为您的桌面创建一个路径,并将其放入一个常量中(通常在 UPPER_CASE 中注明):

    import pathlib
    
    DESKTOP_PATH = pathlib.Path('/Users/user_name/Desktop')
    

    遍历 json 正文中的键和值,根据您的请求,键用作文件名,这就是为什么它以该名称保存在变量中,值是保存 csv 的字典数据:

    for file_name, data in r.json()['body']:
        csv_rows = '\n'.join(','.join(values) for values in zip(*data.values()))
        (DESKTOP_PATH / filename).write_text(f'{",".join(data.keys())}\n{csv_rows}')
    

    在 for 循环中,我们构建了与每个​​文件对应的 csv:zip(*data.values()) 将保存 [column_a_values, column_b_values, ...] 形式的列表列表的值列表转换为一个迭代器,该迭代器将所有元素组合在一起排。即list(zip(*[[1, 2, 3], [4, 5, 6], [7, 8, 9]])) 等于[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

    然后,我们使用','.join(values) 用逗号将所有值连接在一起,并使用'\n'.join(...) 将行与它们之间的新行连接起来。

    最后,我们在桌面路径和DESKTOP_PATH / filename给出的文件名的串联上使用write_text一次性写入所有文本,最终文本由f'{",".join(data.keys())}\n{csv_rows}'给出,它首先输出列名,然后我们在上面计算的行。

    【讨论】:

    • 仅代码的答案被认为是低质量的:请务必说明您的代码的作用以及它如何解决问题。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。另请参阅解释完全基于代码的答案:meta.stackexchange.com/questions/114762/…
    • @borchvm 抱歉,我认为我的代码是不言自明的......现在够清楚了吗?
    • 纯代码答案被认为是低质量的,现在更清晰了,感谢@feature_engineer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2016-11-10
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多