Un exemple de lecture du CSV ligne par ligne tout en convertissant le champ tout en affichant la barre de progression et en faisant quelque chose. La barre de progression est cliquez.
Je vais coller le code pour le moment (C'est aussi un exemple de la façon d'écrire un itérateur qui peut être utilisé avec en quelque sorte ...)
Cliquez ici pour field_converter.py: https://gist.github.com/naoyat/3db8cd96c8dcecb5caea C'est celui de l'article précédent "Je veux convertir par lots les résultats de" string ".split () en Python".
csv_iterator.py
import sys
import csv
import click
from field_converter import FieldConverter
class CSV_Iterator:
def __init__(self, path, skip_header=False, with_progress_bar=False,
field_converter=None):
self.path = path
self.with_progress_bar = with_progress_bar
self.field_converter = field_converter
self.f = open(path, 'r')
self.line_count = sum(1 for line in self.f)
self.f.seek(0) # rewind
self.r = csv.reader(self.f, dialect='excel')
if skip_header:
self.r.next()
self.line_count -= 1
print '(%d lines)' % (self.line_count,)
if self.with_progress_bar:
self.bar = click.progressbar(self.r, self.line_count)
def __iter__(self):
return self
def next(self):
try:
if self.with_progress_bar:
fields = self.bar.next()
else:
fields = self.r.next()
if self.field_converter:
try:
fields = self.field_converter.convert(fields)
except:
print sys.exc_info()
return fields
except:
raise StopIteration
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
return False
if self.with_progress_bar:
print
self.f.close()
return True
Je vais le mettre sur l'essentiel. https://gist.github.com/naoyat/b1290d917638c412e140
Exemple d'utilisation.
example.py
from csv_iterator import CSV_Iterator
def foobar(csv_path):
with CSV_Iterator(csv_path,
skip_header=True,
with_progress_bar=True,
field_converter=FieldConverter(int, int, 'iso-8859-1', 'iso-8859-1', float)) as line:
for id, uid, title, query, target in line:
...