Il suffit de rendre votre lecteur
subscriptable en l'entourant d'une list
. Évidemment, cela ne fonctionnera pas pour les fichiers vraiment volumineux (voir les alternatives dans les Mises à jour ci-dessous) :
>>> reader = csv.reader(open('big.csv', 'rb'))
>>> lines = list(reader)
>>> print lines[:100]
...
Lecture supplémentaire: Comment diviser une liste en morceaux de taille égale en Python ?
Mise à jour 1 (version list) : Une autre façon possible serait simplement de traiter chaque morceau, au fur et à mesure de leur arrivée lors de l'itération sur les lignes :
#!/usr/bin/env python
import csv
reader = csv.reader(open('4956984.csv', 'rb'))
chunk, chunksize = [], 100
def process_chunk(chuck):
print len(chuck)
# faire quelque chose d'utile ...
for i, line in enumerate(reader):
if (i % chunksize == 0 and i > 0):
process_chunk(chunk)
del chunk[:] # ou : chunk = []
chunk.append(line)
# traiter le reste
process_chunk(chunk)
Mise à jour 2 (version générateur) : Je ne l'ai pas testé, mais vous pouvez peut-être améliorer les performances en utilisant un générateur de morceaux :
#!/usr/bin/env python
import csv
reader = csv.reader(open('4956984.csv', 'rb'))
def gen_chunks(reader, chunksize=100):
"""
Générateur de morceaux. Prend un `reader` CSV et renvoie
des tranches de taille `chunksize`.
"""
chunk = []
for i, line in enumerate(reader):
if (i % chunksize == 0 and i > 0):
yield chunk
del chunk[:] # ou : chunk = []
chunk.append(line)
yield chunk
for chunk in gen_chunks(reader):
print chunk # traiter le morceau
# tester gen_chunk sur une séquence factice :
for chunk in gen_chunks(range(10), chunksize=3):
print chunk # traiter le morceau
# => renvoie
# [0, 1, 2]
# [3, 4, 5]
# [6, 7, 8]
# [9]
Il y a une petite mise en garde, comme l'a souligné @totalhack ici:
Soyez conscient que cela renvoie le même objet à plusieurs reprises avec des contenus différents. Cela fonctionne bien si vous prévoyez de faire tout ce dont vous avez besoin avec le morceau entre chaque itération.