2016-11-14 99 views
0

我正在編寫一個小腳本,它通過.csv循環,將每一行作爲字典存儲在文件中,並將該字典發送到API中的一個API 1維列表。Python:從任意大小的數據集創建相同大小的列表

import csv 
import requests 

with open('csv.csv', 'rU') as f: 
    reader = csv.reader(f, skipinitialspace=True) 
    header = next(reader) 
    for row in reader: 
     request = [dict(zip(header, map(str, row)))] 
     r = requests.post(url, headers = i_headers, json = request) 
     print str(reader.line_num) + "-" + str(r) 

request名單看​​起來是這樣的:

[ 
    { 
     "id": "1", 
     "col_1": "A", 
     "col_2": "B", 
     "col_3": "C" 
    } 
] 

這個腳本工作,但我通過一個800萬行的.csv循環,而這種方法簡直是太慢了。我想通過每個API調用發送多行來加速此過程。我正在使用的API允許每次發送最多100行。

如何更改此腳本以增量構建包含100個字典的列表,然後將其發佈到API,然後重複。什麼我會發送給該API的樣本應該是這樣的:

這是行不通的
[ 
    { 
     "id": "1", 
     "col_1": "A", 
     "col_2": "B", 
     "col_3": "C" 
    }, 
    { 
     "id": "2", 
     "col_1": "A", 
     "col_2": "B", 
     "col_3": "C" 
    }, 
... 
... 
... 
    { 
     "id": "100", 
     "col_1": "A", 
     "col_2": "B", 
     "col_3": "C" 
    } 
] 

一件事是建立一個巨大的列表,然後將其分割成大小100的原因正列表因爲我的機器在任何時候都無法在內存中保存所有數據。

+0

分區清單 –

回答

1

可以通過使用range(100)except StopIteration:來做到這一點,但它不是很漂亮。相反,生成器非常適合從CSV文件一次獲取100行數據塊。由於它不會混淆實際的迭代和請求邏輯,因此它會生成相當優雅的代碼。檢查它:

import csv 
import requests 
from itertools import islice 

def chunks(iterator, size): 
    iterator = iter(iterator) 
    chunk = tuple(islice(iterator, size)) 
    while chunk: 
     yield chunk 
     chunk = tuple(islice(iterator, size)) 

with open('csv.csv', 'rU') as f: 
    reader = csv.reader(f, skipinitialspace=True) 
    header = next(reader) 
    for rows in chunks(reader, 100): 
     rows = [dict(zip(header, map(str, row))) for row in rows] 
     r = requests.post(url, headers=i_headers, json=rows) 
     print str(reader.line_num) + "-" + str(r) 

我不是很確定你在哪裏然而從,越來越i_headers,但我相信你已經得到了你的實際代碼想通了。

1

您可以創建要求的清單,每當它的尺寸足夠大,將其發送到API:

import csv 
import requests 

with open('csv.csv', 'rU') as f: 
    reader = csv.reader(f, skipinitialspace=True) 
    header = next(reader) 
    requestList = [] 
    for row in reader: 
     requestList.append(dict(zip(header, map(str, row)))) 
     if len(requestList) >= 100: 
      r = requests.post(url, headers = i_headers, json = requestList) 
      print str(reader.line_num) + "-" + str(r) 
      requestList = [] 

然後,你只需要照顧,你還呼籲該API最後,非完整列表。可以通過在循環後用剩餘列表調用API來完成,或者CSV閱讀器可以告訴你它是否是最後一行。

+0

謝謝!這工作完美。 – sumojelly

+0

謝謝!您可能會考慮將此答案標記爲問題的解決方案。 –