.csvをループし、ファイル内の各行を辞書として格納し、その辞書を1次元リストのAPIに起動する小さなスクリプトを作成しています。
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"
}
]
うまくいかないことの1つは、大規模なリストを作成し、それをサイズ100のn個のリストに分割することです。その理由は、私のマシンが常にそのデータのすべてをメモリに保持できないためです。
range(100)
andを使用してこれを行うことは可能です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
から来ているのか完全にはわかりませんが、実際のコードでそれを理解していると思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加