OVH Cloud OVH Cloud

fonction fichier économe en mémoire?

3 réponses
Avatar
Andréï
Salut,
je suis à la recherche d'une fonction pour lire les fichiers de très
grandes taille sans encombrer la ram du pc (plusieurs centaines de Mo)

La fonction readlines charge tout le fichier en mémoire il me semble,
de plus elle ne me convient pas car je vais devoir rassembler
plusieures lignes pour les besoins du traitement

Il y a tellement de fonctions dans python que l'on peut si perdre un
peu.

Je recherche une fonction du type :
_lire dans le fichier jusqu'a lecture de la sequence 'xyz'.
_lire la suite jusqu'a la sequence 'xyz' ou la fin

Est-ce que ce type de fonction existe ou il faut que me créer ma propre
classe? (il doit bien y avoir un moyen d'accéder en séquentiel avec un
curseur dans le fichier)

3 réponses

Avatar
Amaury
Salut,
je suis à la recherche d'une fonction pour lire les fichiers de très
grandes taille sans encombrer la ram du pc (plusieurs centaines de Mo)

La fonction readlines charge tout le fichier en mémoire il me semble, de
plus elle ne me convient pas car je vais devoir rassembler plusieures
lignes pour les besoins du traitement

Il y a tellement de fonctions dans python que l'on peut si perdre un peu.

Je recherche une fonction du type :
_lire dans le fichier jusqu'a lecture de la sequence 'xyz'.
_lire la suite jusqu'a la sequence 'xyz' ou la fin

Est-ce que ce type de fonction existe ou il faut que me créer ma propre
classe? (il doit bien y avoir un moyen d'accéder en séquentiel avec un
curseur dans le fichier)



J'allais répondre "utilise xreadlines à la place de readlines".
Mais en regardant la doc, j'ai vu qu'à partir de python2.3, il vaut
mieux utiliser "for line in file".
Donc pour lire jusqu'à la séquence 'xyz', on peut utiliser:

f = open('monfichier')

lines = []
for line in f:
if 'xyz' in line:
break
lines.append(line)

Attention, ça ne marche qu'avec des fichiers texte, la lecture se fait
ligne par ligne. Et la mémoire utilisée reste minimale.
Comme quoi en python, il n'y a pas que les fonctions, les objets de base
ont déjà le comportement qu'il faut !

--
Amaury

Avatar
bruno modulix
Andréï wrote:
Salut,
je suis à la recherche d'une fonction pour lire les fichiers de très
grandes taille sans encombrer la ram du pc (plusieurs centaines de Mo)

La fonction readlines charge tout le fichier en mémoire il me semble,


Il me semble aussi. Par contre, tu peux itérer directement sur l'objet file:

f = open('file.txt', 'r')
for line in f:
pass

de
plus elle ne me convient pas car je vais devoir rassembler plusieures
lignes pour les besoins du traitement

Il y a tellement de fonctions dans python que l'on peut si perdre un peu.

Je recherche une fonction du type :
_lire dans le fichier jusqu'a lecture de la sequence 'xyz'.
_lire la suite jusqu'a la sequence 'xyz' ou la fin


Il y a plusieurs façons possibles de faire ça.

Est-ce que ce type de fonction existe ou il faut que me créer ma propre
classe? (il doit bien y avoir un moyen d'accéder en séquentiel avec un
curseur dans le fichier)


file.read()
file.tell()
file.seek()

Eventuellement, l'excellent Text Processing in Python de David Mertz
peut être une lecture intéressante si tu dois parser du texte...

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
F. Petitjean
Salut,
je suis à la recherche d'une fonction pour lire les fichiers de très
grandes taille sans encombrer la ram du pc (plusieurs centaines de Mo)

Je recherche une fonction du type :
_lire dans le fichier jusqu'a lecture de la sequence 'xyz'.
_lire la suite jusqu'a la sequence 'xyz' ou la fin

Est-ce que ce type de fonction existe ou il faut que me créer ma propre
classe? (il doit bien y avoir un moyen d'accéder en séquentiel avec un
curseur dans le fichier)

Comme d'autres l'ont souligné, à partir de Python 2.3, la fonction

open() retourne un objet qui peut être utilisé comme itérateur.
fin = open(fname)
for line in fin:
# traitement sur line

Avec itertools, on a la réponse à vos questions:
import itertools

fin = open(fname)
it = iter(fin)
# lire jusqu'à 'xyzn':
for line in itertools.takewhile(lambda ll : ll != 'xyzn', it):
# traitement avant premier xyz

et faites help(itertools.chain) ...