Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python报表生成器_Python_Api_Csv - Fatal编程技术网

Python报表生成器

Python报表生成器,python,api,csv,Python,Api,Csv,我正在构建一个报告生成器,它通过API请求某些信息,然后解析/将响应写入CSV文件 这一切我都做得很好 问题在于API响应中存在“空”字段。这会导致CSV中的列“折叠” 范例 URL CATEGORY USER URL USER URL CATEGORY USER 以下是包含两行的原始API响应示例(该行以{“url”开头)。第二行缺少“sales\u tax\u value”,因此需要插入一个空字段来补偿: { "expenses": [ {

我正在构建一个报告生成器,它通过API请求某些信息,然后解析/将响应写入CSV文件

这一切我都做得很好

问题在于API响应中存在“空”字段。这会导致CSV中的列“折叠”

范例

URL  CATEGORY  USER
URL  USER
URL  CATEGORY  USER  
以下是包含两行的原始API响应示例(该行以{“url”开头)。第二行缺少“sales\u tax\u value”,因此需要插入一个空字段来补偿:

{
    "expenses": [
        {
            "url": "xxxxxx",
            "user": " xxxxxx ",
            "project": " xxxxxx ",
            "category": "xxxxxx ",
            "dated_on": "xxxxxx ",
            "currency": "xxxxxx ",
            "gross_value": "xxxxxx",
            "native_gross_value": " xxxxxx ",
            "sales_tax_rate": " xxxxxx ",
            "sales_tax_value": " xxxxxx ",
            "native_sales_tax_value": " xxxxxx",
            "description": " xxxxxx ",
            "mileage": " xxxxxx ",
            "engine_size_index": "xxxxxx",
            "engine_type_index": "xxxxxx",
            "vehicle_type": "xxxxxx",
            "initial_rate_mileage": " xxxxxx ",
            "have_vat_receipt": "xxxxxx",
            "updated_at": " xxxxxx ",
            "created_at": " xxxxxx "
        },
        {
            "url": "xxxxxx",
            "user": " xxxxxx ",
            "project": " xxxxxx ",
            "category": "xxxxxx ",
            "dated_on": " xxxxxx ",
            "currency": " xxxxxx ",
            "gross_value": " xxxxxx ",
            "native_gross_value": " xxxxxx ",
            "sales_tax_rate": " xxxxxx ",
            "description": " xxxxxx ",
            "mileage": " xxxxxx ",
            "engine_size_index": "xxxxxx",
            "engine_type_index": "xxxxxx",
            "vehicle_type": " xxxxxx ",
            "initial_rate_mileage": " xxxxxx ",
            "have_vat_receipt": "xxxxxx",
            "updated_at": " xxxxxx ",
            "created_at": " xxxxxx "
        }
    ]
}
我尝试了大量的“if”语句来检查每个“header”是否存在,如果没有,则将其附加到行中,但到目前为止没有成功。这导致创建了一些大的(1.1GB)CSV文件。我将这归因于我编写的循环写得很糟糕


如果需要更多详细信息,请告诉我。

声明要输出到CSV文件的字段列表:

fields = ['url', 'category', 'user']
然后循环响应中的项,并获取值或默认值:

for expense in response['expenses']:
    data = [expense.get(field, '') for field in fields]
    # do whatever
如果使用,您可以将词典直接传递给编写器,它将为您处理缺少的键:

 import csv

 with open(outputfilename, 'wb') as outfh:
     writer = csv.DictWriter(outfh, fieldnames=('url', 'category', 'user'), extrasaction='ignore')
     writer.writerows(data['expenses'])
注:

  • fieldnames
    参数指定将使用哪些键
    csv.DictWriter()
    写入csv文件
  • extrasaction='ignore'
    关键字参数告诉编写器忽略字典中的任何其他键
  • 输入字典中任何缺少的键都使用默认为空字符串的
    restval
    参数。这意味着如果缺少“category”键,该列仍将作为空值添加到输出文件中
  • 您只需一次将整个
    费用
    列表传递到
    writer.writerows()

  • 向我们展示您的代码,这样我们就可以知道如何修复它。非常感谢您提供的精彩提示。我使用了CSV模块,但在通过CSV编写器之前,我使用json.loads读取了响应。再次感谢您提供的所有帮助。