Comment lire de grands fichiers texte dans Python
L'objet fichier Python fournit différentes façons de lire un fichier texte. La méthode populaire est d'utiliser la méthode readlines() qui renvoie une liste de toutes les lignes du fichier. Cependant, elle n'est pas adaptée pour lire un gros fichier texte car tout le contenu du fichier sera chargé dans la mémoire.
Lire de grands fichiers texte en Python
Nous pouvons utiliser l'objet fichier comme un itérateur. L'itérateur renverra chaque ligne une par une, ce qui peut être traité. Cela ne lira pas tout le fichier en mémoire et c'est adapté pour lire de gros fichiers en Python. Voici l'extrait de code pour lire un gros fichier en Python en le traitant comme un itérateur.
import resource
import os
file_name = "/Users/pankaj/abcdef.txt"
print(f'File Size is {os.stat(file_name).st_size / (1024 * 1024)} MB')
txt_file = open(file_name)
count = 0
for line in txt_file:
# we can process file line by line here, for simplicity I am taking count of lines
count += 1
txt_file.close()
print(f'Number of Lines in the file is {count}')
print('Peak Memory Usage =', resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('User Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_utime)
print('System Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_stime)
Lorsque nous exécutons ce programme, la sortie produite est :
File Size is 257.4920654296875 MB
Number of Lines in the file is 60000000
Peak Memory Usage = 5840896
User Mode Time = 11.46692
System Mode Time = 0.09655899999999999
- J'utilise le module os pour afficher la taille du fichier.
- Le module de ressources est utilisé pour vérifier l'utilisation de la mémoire et du temps CPU du programme.
Nous pouvons également utiliser l'instruction with pour ouvrir le fichier. Dans ce cas, nous n'avons pas besoin de fermer explicitement l'objet fichier.
with open(file_name) as txt_file:
for line in txt_file:
# process the line
pass
Que se passe-t-il si le gros fichier n'a pas de lignes ?
Le code ci-dessus fonctionnera très bien lorsque le contenu du fichier volumineux est divisé en plusieurs lignes. Mais, s'il y a une grande quantité de données sur une seule ligne, cela utilisera beaucoup de mémoire. Dans ce cas, nous pouvons lire le contenu du fichier dans un tampon et le traiter.
with open(file_name) as f:
while True:
data = f.read(1024)
if not data:
break
print(data)
Le code ci-dessus lira les données du fichier dans un tampon de 1024 octets. Ensuite, nous les imprimons à la console. Lorsque le fichier entier est lu, les données deviendront vides et l'instruction break mettra fin à la boucle while. Cette méthode est également utile pour lire un fichier binaire tel que des images, des PDF, des documents Word, etc. Voici un extrait de code simple pour faire une copie du fichier.
with open(destination_file_name, 'w') as out_file:
with open(source_file_name) as in_file:
for line in in_file:
out_file.write(line)
Référence : Question StackOverflow

