このタイプの非常に単純なcsvファイルがあります(たとえば、フィボナッチ数を入れました):
nn,number
1,1
2,1
3,2
4,3
5,5
6,8
7,13
8,21
9,34
10,55
11,89
12,144
13,233
14,377
15,610
16,987
17,1597
18,2584
19,4181
20,6765
21,10946
22,17711
23,28657
24,46368
25,75025
26,121393
27,196418
そして、次の方法で行を一括処理しようとしています(fib番号は関係ありません)
import csv
b=0
s=1
i=1
itera=0
maximum=10000
bulk_save=10
csv_file='really_simple.csv'
fo = open(csv_file)
reader = csv.reader(fo)
##Skipping headers
_headers=reader.next()
while (s>0) and itera<maximum:
print 'processing...'
b+=1
tobesaved=[]
for row,i in zip(reader,range(1,bulk_save+1)):
itera+=1
tobesaved.append(row)
print itera,row[0]
s=len(tobesaved)
print 'chunk no '+str(b)+' processed '+str(s)+' rows'
print 'Exit.'
私が得る出力は少し奇妙です (リーダーがループの最後でエントリを省略しているかのように)
processing...
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
chunk no 1 commited 10 rows
processing...
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
chunk no 2 commited 10 rows
processing...
21 23
22 24
23 25
24 26
25 27
chunk no 3 commited 5 rows
processing...
chunk no 4 commited 0 rows
Exit.
何が問題なのか分かりますか?私の推測では、zip関数です。
私がそのようなコードを持っている理由 (データのチャンクを取得する) は、sqlite3 データベースに大量の csv エントリを保存する必要があるためです (すべての zip ループの最後で executemany と commit を使用して、メモリが過負荷にならないようにします。ありがとう!