IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

lire dernier record d'un fichier


Sujet :

Python

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut lire dernier record d'un fichier
    Bonjour,
    Y a t'il un moyen de lire le dernier record d'un fichier sans lire tout le fichier ?
    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 047
    Points : 1 377
    Points
    1 377
    Par défaut
    qui crée le fichier ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par awalter1 Voir le message
    Y a t'il un moyen de lire le dernier record d'un fichier sans lire tout le fichier ?
    Les fichiers sont gérés par l'OS et Python ne fait que s'interfacer avec les primitives correspondantes.

    La fonction seek permet de positionner l'endroit qui affectera la prochaine opération sur le fichier (qu'on peut considérer comme un tableau de bytes).
    Si les "records" sont de taille fixe, le début du record N sera simple à calculer.
    S'ils sont de longueur variable, il faudra rechercher le délimiteur qui matérialise le début du dernier record => lire les blocks de fin et y rechercher le dernier record.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Oui, c'est possible en utilisant la méthode évoquée par wiztricks: lire le fichier sous forme binaire (blocs d'octets), chercher les fins de lignes ('\n' suffit pour Windows et Linux) et s'arrêter à la dernière ou à l'avant dernière, lire l'adresse (tell) et charger la ligne (seek). Attention au piège: quelquefois la dernière ligne est vide et c'est l'avant dernière qu'il faut garder. Autre piège: si l'encodage permet à certains caractères composites d'avoir un octet identique à la fin de ligne: ça ne marche plus (je n'ai pas vérifié que c'est possible avec l'unicode, mais il n'y a pas de problème avec les encodages courants).

    Il y a quelques temps, je m'étais amusé à compter le nombre de lignes d'un fichier texte sans lire les lignes: ça marche très bien, et c'est 10 fois plus rapide. Il doit y avoir des choses à récupérer pour ce problème. Mon tuto est ici: http://python.jpvweb.com/mesrecettes...lignes_fichier.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    S'il est utile de montrer l'utilisation de .seek et de .tell pour lire les n dernières lignes d'un fichier texte, on peut le faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def tail(f, n):
        """Reads last n lines from f
        """
        avg_length = 74
        while 1:
            try:
                f.seek(-(avg_length * n), 2)
            except IOError:
                # assume file is not large enough
                f.seek(0)
            pos = f.tell()
            lines = f.read().splitlines()
            if len(lines) >= n or pos == 0:
                return lines[-n:]
            avg_length *= 1.3
    Nota le "record" est alors délimité par la fin de ligne, ce qui n'est pas forcément ce que cherche le PO.

    Comme on se contente de lire la fin du fichier, pas la peine d'essayer d'optimiser la recherche des fin de lignes ('\n').
    .splitlines fait cela très bien et çà simplifie pas mal les choses.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    => lire les blocks de fin et y rechercher le dernier record.
    Mais comment trouver les blocs de fin ?

    si j'ouvre mon fichier en mode "a", pour écrire, le système sait ou se trouve la fin du fichier. Si je peux récupérer la fin du fichier (soit f), alors avec la fonction seek() je pourrais me positionner x caractères avant f, non ?

    Merci

  7. #7
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut

    Citation Envoyé par awalter1 Voir le message
    Si je peux récupérer la fin du fichier (soit f), alors avec la fonction seek() je pourrais me positionner x caractères avant f, non ?
    Normalement le seek ne s'utilise qu'en binaire à cause des différences de fin de lignes dans les différents OS. Chez microsoft par exemple le fin de ligne fait 2 bytes de long, un sous linux/unix. Donc un fseek peut ne pas donner le même résultat d'une machine à une autre. Si tu utilises de l'utf-8, un caractère peut faire plusieurs octets. Donc, tu pourras certes te positionner x bytes avant la fin, mais pas x caractères avant la fin.

    A+

    Pfeuh

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    si j'ouvre mon fichier en mode "a", pour écrire, le système sait ou se trouve la fin du fichier. Si je peux récupérer la fin du fichier (soit f), alors avec la fonction seek() je pourrais me positionner x caractères avant f, non ?
    Pas besoin de connaitre le nombre de bytes du fichier (i.e. la fin), la méthode .seek prend un offset qui s'applique depuis le début, la position courante ou à partir de la fin.
    Relisez l'exemple que j'ai posté
    Tout est dans "f.seek(-(avg_length * n), 2):
    • "2" indique "à partir de la fin"
    • -(avg_length * n) est un offset négatif

    On se positionne à (avg_length * n) avant la fin et le .read qui vient ensuite retourne ce qu'il trouve de cette position "jusqu'à la fin" du fichier.
    Enfin .splitlines découpe ce qui a été récupéré en "lignes" au sens Python.
    => la dernière ligne sera comptée quelle se termine ou pas d'un '\n'
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Normalement le seek ne s'utilise qu'en binaire à cause des différences de fin de lignes dans les différents OS. Chez microsoft par exemple le fin de ligne fait 2 bytes de long, un sous linux/unix. Donc un fseek peut ne pas donner le même résultat d'une machine à une autre. Si tu utilises de l'utf-8, un caractère peut faire plusieurs octets. Donc, tu pourras certes te positionner x bytes avant la fin, mais pas x caractères avant la fin.
    .seek donnera le même résultat.
    Ce qui change c'est le boulot à faire pour trouver le début de la dernière ligne.
    Mais comme c'est Python qui s'en charge, c'est un "no problem".
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Python 2.7 // Lire les derniers entrées d'un fichier en temps réel.
    Par El_Diablo666 dans le forum Général Python
    Réponses: 1
    Dernier message: 15/02/2014, 15h27
  2. Réponses: 12
    Dernier message: 29/12/2010, 13h34
  3. [WD14E] lire les dernieres lignes d'un fichier texte
    Par itak33 dans le forum WinDev
    Réponses: 3
    Dernier message: 27/04/2010, 13h46
  4. lire la derniere ligne d'un fichier
    Par Viscapon dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 12/06/2008, 17h57
  5. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo