2016-11-14 55 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

谢谢!您可能会考虑将此答案标记为问题的解决方案。 –

相关问题