在附加到csv文件之前,在Python中操作API数据



我正在从RESTful API请求数据。第一个请求被写入一个csv文件,没有任何问题。在csv文件中,数据有5个标题行(包括列标题(、11行实际数据(每行13个字段(和一个EOF行,因此总共有17行数据(打印(response.text(命令后显示的数据(显示在本文末尾。

对于API的后续请求,我只想将11行数据(即第6行到第16行(附加到现有的csv文件中。为了创建一个可能有近百万行数据的大型csv文件,我将多次重复这个过程。我正在努力寻找一种方法来处理API返回的数据,以便只将第6行到第16行写入csv文件。

我对编码和Python还很陌生,所以我很感激关于如何继续的建议。

这就是Python"print"命令中的数据(第一个星号是第1行(。第五个星号表示列标题的开头,"Document RevNum"是最后一个列标题(:

*
*
*Actual Aggregated Generation Per Type (B1620) Data
*
*Document Type,Business Type,Process Type,Time Series ID,Quantity,Curve Type,Resolution,Settlement Date,Settlement Period,Power System Resource  Type,Active Flag,Document ID,Document RevNum
Actual generation per type,Solar generation,Realised,NGET-EMFIP-AGPT-TS-21614701,3250,Sequential fixed size block,PT30M,2020-07-01,21,"Solar",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Wind generation,Realised,NGET-EMFIP-AGPT-TS-21614702,2075.338,Sequential fixed size block,PT30M,2020-07-01,21,"Wind Offshore",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Wind generation,Realised,NGET-EMFIP-AGPT-TS-21614703,1486.519,Sequential fixed size block,PT30M,2020-07-01,21,"Wind Onshore",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614704,258,Sequential fixed size block,PT30M,2020-07-01,21,"Other",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614705,4871,Sequential fixed size block,PT30M,2020-07-01,21,"Nuclear",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614706,0,Sequential fixed size block,PT30M,2020-07-01,21,"Fossil Oil",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614707,16448,Sequential fixed size block,PT30M,2020-07-01,21,"Fossil Gas",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614708,0,Sequential fixed size block,PT30M,2020-07-01,21,"Fossil Hard coal",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614709,783,Sequential fixed size block,PT30M,2020-07-01,21,"Hydro Run-of-river and poundage",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614710,118,Sequential fixed size block,PT30M,2020-07-01,21,"Hydro Pumped Storage",Y,NGET-EMFIP-AGPT-06372506,1
Actual generation per type,Production,Realised,NGET-EMFIP-AGPT-TS-21614711,3029,Sequential fixed size block,PT30M,2020-07-01,21,"Biomass",Y,NGET-EMFIP-AGPT-06372506,1
<EOF>

我将您的问题解释为无法将新获取的数据附加到CSV文件中。我不确定你是否正在使用一些有助于处理CSV文件的模块,但我只是假设你现在还没有。

如果你只是用";a";作为像(f = open("file.csv","a")(一样打开的第二个参数,您可以轻松地附加新内容。不过,您首先必须去掉EOF行,然后再添加一个新行,但我认为这不是问题所在。希望我能帮助你,请告诉我我是否正确理解你的问题:(

顺便说一句,我建议你为此或类似sqlite3的东西寻找一个CSV模块。

似乎有效的解决方案如下:

回想一下,API为给定日期返回一个长字符串的comma-separated数据。当数据被写入csv文件时,它显示为4行我不感兴趣的"标题"数据、1行列标题数据(13列(、11行我感兴趣的数据(所有13列中都有数据(和1行我不需要的("EOF"(。

在第一个API查询中,我想创建一个只有列标题和11行数据的csv文件,丢弃前4行(冗余信息(和最后一行("EOF"(数据。

在所有后续的API查询中,我只想将11行数据附加到已经创建的csv文件中。

API响应以字符串形式返回。

以下代码排除了前4行和最后一行("EOF"(,但仍将列标题和11行有用数据写入新创建的csv文件:

# Write to .CSV
with open('C:/Users/Paul/.spyder-py3/Elexon API Data 05.csv', "w") as f:
f.write(api_response.text[59:-5])

API响应字符串的前59个字符和后5个字符将始终相同,因此我可以确信这将适用于初始API响应。

对于随后的API响应,我使用以下代码附加到csv文件:

# Now append the api response data to the CSV file
with open('C:/Users/Paul/.spyder-py3/Elexon API Data 05.csv', "a") as f:
f.write(api_response.text[248:-5])

这排除了附加到csv文件的API响应中的前248个和最后5个字符。字符串的前248个字符将始终包括相同的冗余信息,最后5个字符将总是包括",因此我可以再次确信,只有我感兴趣的11行数据将被附加到csv文件中。

对于这个特殊的情况,解决方案比我预期的要简单,感谢CodingGuy指导我从api响应的开始和结束剥离数据,并探索我正在处理的数据类型。

如果我的解决方案有问题,请告诉我。同样,我总是有兴趣学习在Python中处理数据的更复杂的方法。

最新更新