我已經通過JSON物件迭代通過API查詢回傳給我,并能獲得資料(obj_key1)到我target_csv,但資料是顯示在第一列,而不是向上data列,而我試圖來指定。
示例 JSON:
[{'obj_key': 0.5,
'obj_key1': 4000,
'obj_key2': '2020-05-01',
'obj_key3': 0.0,
'obj_key4': 'US',
'obj_key5': 50000,
'obj_key6': 11,
'obj_key7': 0.0,
'obj_key8': 20000,
'obj_key9': 0.01,
'obj_key10': '6786547',
'obj_key11': None,
'obj_key12': 12},
{'obj_key': 0.4,
'obj_key1': 5000,
'obj_key2': '2020-05-02',
'obj_key3': 0.0,
'obj_key4': 'US',
'obj_key5': 657435,
'obj_key6': 112,
'obj_key7': 0.0,
'obj_key8': 678548,
'obj_key9': 0.032,
'obj_key10': '6786547',
'obj_key11': None,
'obj_key12': 13},...]
代碼:
import csv
import json
import requests
token = {token}
with open('../folder/file.csv') as src, open('target_file.csv', 'w', newline='') as tgt:
reader = csv.reader(src)
writer = csv.writer(tgt)
columns = next(reader)
writer.writerow(columns)
headers = {
'Authorization': token,
'Content-Type': 'application/json; charset=utf-8',
}
for id, name, date, data in reader:
response = requests.get(f'https://{base_url}/api/endpoint?start_date=2021-05-01&end_date=2021-05-15' '&id=' str(id),
headers=headers
)
response_data = response.json()
for i in range(len(response_data)):
data = writer.writerows(map(lambda x: [response_data[i]['obj_key1']], range(1)))
預期的 CSV 輸出:
| ID | 名稱 | 日期 | 資料 |
|---|---|---|---|
| 6786547 | 名稱 | 2020-05-01 | 4000 |
| 6786547 | 名稱 | 2020-05-02 | 5000 |
uj5u.com熱心網友回復:
我將推薦一些看起來非常不同的東西,但應該可以完成作業。
對我來說,重要的想法是將程序分成不同的部分——每個人都更容易理解。
先讀
我選擇將所有 API 讀取保存到一個dicts串列中,該串列將在下一部分中用 CSV DictWriter 寫出。
import csv
import requests
path = f'https://{base_url}/api/endpoint?start_date=2021-05-01&end_date=2021-05-15'
token = {token}
headers = {
'Authorization': token,
'Content-Type': 'application/json; charset=utf-8',
}
final_rows = []
with open('../folder/file.csv') as src:
reader = csv.reader(src)
next(reader) # discard this header, will be created from dict row
for my_id, name, date in reader: # omitted `data` from input
response = requests.get(path f'&id={my_id}', headers=headers)
# Assuming `response.json()` looks like the sample JSON you provided
for json_data in response.json():
final_row = {
'id': my_id,
'name': name,
'date': date,
'data': json_data['obj_key1']
}
final_rows.append(final_row)
我模擬了final_rows,它看起來像:
final_rows = [
{
'id': '6786547',
'name': 'Name',
'date': '2020-05-01',
'data': '4000'
},
{
'id': '6786547',
'name': 'Name',
'date': '2020-05-02',
'data': '5000'
}
]
然后寫
現在,final_rows幾乎只會寫自己:
with open('target_file.csv', 'w', newline='') as tgt:
writer = csv.DictWriter(tgt, fieldnames=final_rows[0].keys())
writer.writeheader()
writer.writerows(final_rows)
我得到:
id,name,date,data
6786547,Name,2020-05-01,4000
6786547,Name,2020-05-02,5000
uj5u.com熱心網友回復:
下面是如何實作我在我的建議評論有關呼叫writerow()多次,并通過所有四列(id,name,date和data)。您也許可以優化它以先創建行,然后再呼叫一次writerows(),但我懷疑這是否值得付出努力。
請注意,您忽略回應中串列的每個物件的輸入并使用正在讀取的 CSV 檔案date中'obj_key2'的物件,這對我來說似乎很奇怪- 但這似乎是您在問題中所說的。
import csv
import json
import requests
token = {token}
with open('../folder/file.csv', 'r', newline='') as src, \
open('target_file.csv', 'w', newline='') as tgt:
reader = csv.reader(src)
writer = csv.writer(tgt)
writer.writerow(next(reader) ['data']) # Copy header row and add column.
headers = {'Authorization': token,
'Content-Type': 'application/json; charset=utf-8'}
for id, name, date, data in reader:
response = requests.get(
f'https://{base_url}/api/endpoint?start_date=2021-05-01&end_date=2021-05-15'
f'&id={id}', headers=headers)
for obj in response.json():
writer.writerow([id, name, date, obj['obj_key1']])
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/392160.html
