Python报表生成器
我正在构建一个报告生成器,它通过API请求某些信息,然后解析/将响应写入CSV文件 这一切我都做得很好 问题在于API响应中存在“空”字段。这会导致CSV中的列“折叠” 范例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": [ {
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读取了响应。再次感谢您提供的所有帮助。