Comment lire fichier N lignes à la fois en Python?
J'ai besoin de lire un gros fichier en lecture à N lignes à la fois, jusqu'à ce que les expressions du FOLKLORE. Quel est le moyen le plus efficace de le faire en Python? Quelque chose comme:
with open(filename, 'r') as infile:
while not EOF:
lines = [get next N lines]
process(lines)
- Rapide très bête question: est-ce que vous allez faire à l'intérieur de
process(lines)
travail si N == 1? Si pas, vous avez un problème avec une seule ligne dans la dernière tas. Si cela fonctionne avec N == 1, alors il serait beaucoup plus efficace que de faire seulementfor line in infile: work_on(line)
.
Vous devez vous connecter pour publier un commentaire.
Une solution serait une compréhension de liste et la tranche de l'opérateur:
Après cette
lines
est un tuple de lignes. Cependant, ce serait de charger l'intégralité du fichier en mémoire. Si vous ne voulez pas que cela (c'est à dire si le fichier est peut-être vraiment grand) il y a une autre solution à l'aide d'un générateur d'expression etislice
de la itertools package:lines_gen
est un générateur de l'objet, qui vous donne chaque ligne du fichier, et peut être utilisé dans une boucle comme ceci:Deux solutions vous donner jusqu'à N lignes (ou moins, si le fichier n'a pas beaucoup d').
lines = islice(infile, N)
Un objet de fichier est un itérateur sur les lignes en Python. Pour parcourir le fichier N lignes à la fois, vous pouvez utiliser loches() itertools' recette (voir Qu'est-ce que la plupart des “pythonic” chemin à parcourir une liste en morceaux?):
Exemple
b'\n'
-lignes 2-itertools.izip_longest
n'est pas supprimé en Python 3, il est renommé pouritertools.zip_longest
zip
/izip
fonctions a "enlevé" en Python 3 --- le code de l'un est absent, le nom de l'autre.itertools.zip_longest()
en Python 3 etitertools.izip_longest()
en Python 2 sont sur le même objet.Ce code fonctionnera avec n'importe quel nombre de lignes dans le fichier et tout
N
. Si vous avez1100 lines
dans le fichier etN = 200
, vous obtiendrez 5 fois pour traiter des morceaux de 200 lignes et une fois avec 100 lignes.peut-être:
Je pense que vous devriez être à l'aide de morceaux au lieu de spécifier le nombre de lignes à lire. Il rend votre code plus robuste et générique. Même si les lignes sont de gros, à l'aide de morceau de charger uniquement la quantité attribuée de données en mémoire.
Reportez-vous à cette lien
Comment sur une boucle for?
for i in range(7)
Vous pourriez avoir à faire quelque chose d'aussi simple que:
Mise à jour après les commentaires:
process()
, si ce n'est les frais généraux.Si vous pouvez lire le dossier complet à l'avance;
J'avais besoin de lire dans le n lignes à la fois à partir de fichiers pour les très gros fichiers (~1 TO) et a écrit un package simple pour ce faire. Si vous
pip install bigread
, vous pouvez le faire:block_size
est le nombre de lignes à lire à la fois.Je cherchais une réponse à la même question, mais n'aime pas vraiment tout de la proposition de trucs plus tôt, donc j'ai fini par écrire un peu laid chose qui fait exactement ce que je voulais
sans utiliser étrange bibliothèques.