Comment vous répartissez vous lire un gros fichier csv dans uniformément gros morceaux de taille en Python?
Dans une base, j'avais le processus suivant.
import csv
reader = csv.reader(open('huge_file.csv', 'rb'))
for line in reader:
process_line(line)
Voir ce question. Je veux envoyer le processus en ligne, toutes les 100 lignes, de mettre en œuvre lot de fragmentation.
Le problème au sujet de la mise en œuvre de la relative réponse est que csv objet est unsubscriptable et ne peuvent pas utiliser len.
>>> import csv
>>> reader = csv.reader(open('dataimport/tests/financial_sample.csv', 'rb'))
>>> len(reader)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type '_csv.reader' has no len()
>>> reader[10:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is unsubscriptable
>>> reader[10]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is unsubscriptable
Comment puis-je résoudre ce problème?
OriginalL'auteur Mario César | 2011-02-10
Vous devez vous connecter pour publier un commentaire.
Suffit de faire votre
reader
subscriptable en l'enveloppant dans unlist
. Évidemment, cela cassera sur de très gros fichiers (voir les alternatives à la Mises à jour ci-dessous):Pour en savoir plus: Comment vous répartissez vous une liste en morceaux de taille égale en Python?
Mise à jour de 1 (liste version): une Autre manière possible serait de simplement traiter chaque mandrin, comme il arrive lors de l'itération sur les lignes:
Mise à jour 2 (générateur de version): je n'ai pas comparé, mais peut-être que vous pouvez augmenter les performances en utilisant un morceau générateur:
Magnifique, merci @TheMYYN 🙂
Ajout d'un générateur de version, qui pourrait être plus rapide (mais je n'ai pas eu le temps de tester, peut - être que vous faites).
Wah, c'est irritant. Voici un autre gist (gist.github.com/820490), juste essayé moi-même avec python 2.5. Si cela ne suffit pas à le résoudre, je suis d'options (et de temps 😉 pour répondre à cette question. Bonne chance!
Parfait 😀
OriginalL'auteur miku
Il n'y a pas un bonne façon de le faire pour tous les
.csv
fichiers. Vous devriez être en mesure de diviser le fichier en morceaux à l'aide defichier.rechercher
de sauter une section du fichier. Ensuite, vous devez analyser un octet à la fois pour trouver la fin de la ligne. Vous pouvez traiter les deux morceaux de façon indépendante. Quelque chose comme ce qui suit (non testé) code devrait vous obtenir a commencé.Je ne suis pas sûr de savoir comment vous pouvez dire que vous avez terminé la traversée
segment_one
. Si vous avez une colonne du fichier CSV qui est un numéro d'identification de ligne, alors vous pouvez arrêter le traitementsegment_one
lorsque vous rencontrez l'id de ligne de la première ligne desegment_two
.OriginalL'auteur D.Shawley
Nous pouvons utiliser les pandas module pour gérer ces gros fichiers csv.
OriginalL'auteur debaonline4u