J'ai besoin de lire un gros fichier, ligne par ligne. Disons que le fichier a plus de 5 Go et que je dois lire chaque ligne, mais je ne veux évidemment pas l'utiliser readlines()
car cela créera une très grande liste en mémoire.
Comment le code ci-dessous fonctionnera-t-il dans ce cas? Se xreadlines
lit-il un par un en mémoire? L'expression du générateur est-elle nécessaire?
f = (line for line in open("log.txt").xreadlines()) # how much is loaded in memory?
f.next()
De plus, que puis-je faire pour lire ceci dans l'ordre inverse, tout comme la tail
commande Linux ?
J'ai trouvé:
http://code.google.com/p/pytailer/
et
" tête, queue et arrière en python lus par les lignes d'un fichier texte "
Les deux ont très bien fonctionné!
Réponses:
J'ai fourni cette réponse parce que Keith, bien que succinct, ne ferme pas le fichier explicitement
la source
for
boucle qui itère sur les lignes, vous pouvez utiliserchunk = infile.read(chunksize)
pour lire des morceaux de taille limitée quel que soit leur contenu. Vous devrez chercher vous-même dans les morceaux pour les nouvelles lignes.Il vous suffit d'utiliser l'objet fichier comme itérateur.
Encore mieux utilise le gestionnaire de contexte dans les versions récentes de Python.
Cela fermera automatiquement le fichier également.
la source
Une approche old school:
la source
Il vaut mieux utiliser un itérateur à la place. Pertinent: http://docs.python.org/library/fileinput.html
De la documentation:
Cela évitera de copier le fichier entier en mémoire à la fois.
la source
close()
méthode de l'FileInput
objet classe retourné lorsque la boucle se termine - j'éviterais donc de l'utiliser de cette façon. En Python 3.2, ils ont finalement rendufileinput
compatible avec le protocole du gestionnaire de contexte qui résout ce problème (mais le code ne serait toujours pas écrit de la manière indiquée).Voici ce que vous faites si vous n'avez pas de retour à la ligne dans le fichier:
la source
Veuillez essayer ceci:
la source
Je ne pouvais pas croire que cela pourrait être aussi simple que la réponse de @ john-la-rooy le faisait croire. J'ai donc recréé la
cp
commande en utilisant la lecture et l'écriture ligne par ligne. C'est FOU RAPIDE.la source
readline
standardise les fins de ligne, cela a pour effet secondaire de convertir des documents avec des fins de ligne DOS de en fins de\r\n
ligne Unix de\n
. Toute ma raison pour rechercher ce sujet était que je devais convertir un fichier journal qui reçoit un mélange de fins de ligne (parce que le développeur a utilisé aveuglément diverses bibliothèques .NET). J'ai été choqué de constater qu'après mon test de vitesse initial, je n'avais pas besoin de revenir en arrière etrstrip
les lignes. C'était déjà parfait!Le projet Blaze a parcouru un long chemin au cours des 6 dernières années. Il dispose d'une API simple couvrant un sous-ensemble utile de fonctionnalités de pandas.
dask.dataframe prend en charge la segmentation en interne, prend en charge de nombreuses opérations parallélisables et vous permet d'exporter facilement des tranches vers des pandas pour des opérations en mémoire.
la source
Voici le code pour charger des fichiers texte de n'importe quelle taille sans causer de problèmes de mémoire. Il prend en charge des fichiers de taille gigaoctet
https://gist.github.com/iyvinjose/e6c1cb2821abd5f01fd1b9065cbc759d
téléchargez le fichier data_loading_utils.py et importez-le dans votre code
usage
La méthode process_lines est la fonction de rappel. Il sera appelé pour toutes les lignes, avec des données de paramètres représentant une seule ligne du fichier à la fois.
Vous pouvez configurer la variable CHUNK_SIZE en fonction des configurations matérielles de votre machine.
la source
Que dis-tu de ça? Divisez votre fichier en morceaux, puis lisez-le ligne par ligne, car lorsque vous lisez un fichier, votre système d'exploitation met en cache la ligne suivante. Si vous lisez le fichier ligne par ligne, vous n'utilisez pas efficacement les informations mises en cache.
Au lieu de cela, divisez le fichier en morceaux et chargez le morceau entier en mémoire, puis effectuez votre traitement.
la source
Je vous remercie! J'ai récemment converti en python 3 et j'ai été frustré en utilisant readlines (0) pour lire des fichiers volumineux. Cela a résolu le problème. Mais pour obtenir chaque ligne, j'ai dû faire quelques étapes supplémentaires. Chaque ligne était précédée d'un "b" qui, je suppose, était au format binaire. L'utilisation de "decode (utf-8)" l'a changé ascii.
Ensuite, j'ai dû supprimer un "= \ n" au milieu de chaque ligne.
Ensuite, j'ai divisé les lignes sur la nouvelle ligne.
Voici le code commençant juste au-dessus des "données d'impression" dans le code d'Arohi.
la source
J'ai démontré une approche d'accès aléatoire au niveau octet parallèle ici dans cette autre question:
Obtention du nombre de lignes dans un fichier texte sans lignes de lecture
Certaines des réponses déjà fournies sont agréables et concises. J'aime certains d'entre eux. Mais cela dépend vraiment de ce que vous voulez faire avec les données contenues dans le fichier. Dans mon cas, je voulais juste compter les lignes, aussi vite que possible sur les gros fichiers texte. Mon code peut être modifié pour faire d'autres choses aussi bien sûr, comme n'importe quel code.
la source
La meilleure solution que j'ai trouvée à ce sujet, et je l'ai essayée sur un fichier de 330 Mo.
Où line_length est le nombre de caractères sur une seule ligne. Par exemple, "abcd" a une longueur de ligne 4.
J'ai ajouté 2 longueurs de ligne pour ignorer le caractère «\ n» et passer au caractère suivant.
la source
Cela peut être utile lorsque vous souhaitez travailler en parallèle et lire uniquement des morceaux de données, mais les garder propres avec de nouvelles lignes.
la source
J'espère que cela t'aides.
la source