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 :

IOError lors de la mise à jour d'un fichier


Sujet :

Python

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut IOError lors de la mise à jour d'un fichier
    Bonjour
    Je suis en train de développer une petite bibliothèque de gestion des nombres premiers, et je veux permettre la gestion d'une table pour accélérer les recherches. Les fonctions de recherche dans la table fonctionnent sans problème mais pas celles de mise à jour :
    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 SearchForPrimes(self, nmax, verbose = False):
            self.fd.seek(0, 2) ##self.fd = open(self.f, "r+b")
            n = self.maxn + 1 #plus grand nombre de la table
            pos = self.ofs #position du dernier entier écrit
            while n < nmax:
                if IsPrime(n):
                    pos = self.fd.tell()
                    save_int(n, self.fd) #la ligne qui lance l'erreur
                    self.fd.flush()
                    self.maxn = n
                    if verbose: print "Found prime:", n
                n += 1
            self.fd.seek(0)
            self.fd.write(struct.pack("I", pos))
            self.fd.flush()
    La fonction save_int:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def save_int(n, fd):
        n = abs(int(n))
        s = _int2bin(n)
        fd.write(struct.pack("I", len(s))) #c'est ce write qui lance l'erreur
        fd.write(s)
     
    def _int2bin(n):
        q, r = -1, -1
        res = ""
        while q != 0:
            q, r = divmod(n, 256)
            res = chr(r) + res
            n = q
        return res
    L'erreur:
    Traceback (most recent call last):
    File "E:\Projets\Primes\PrimeOps.py", line 100, in <module>
    table.SearchForPrimes(n, True);
    File "E:\Projets\Primes\PrimeOps.py", line 44, in SearchForPrimes
    save_int(n, self.fd)
    File "E:\Projets\Primes\_tools.py", line 7, in save_int
    fd.write(struct.pack("I", len(s)))
    IOError: [Errno 0] Error
    Je ne vois pas ce qui pourrait ne pas fonctionner, vu que si j'essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> fd = open("tmp.txt", "wb")
    >>> fd.write("aaaa")
    >>> fd.close()
    >>> fd = open("tmp.txt", "r+b")
    >>> fd.read(4)
    'aaaa'
    >>> fd.seek(1)
    >>> fd.write("bcd")
    >>> fd.flush()
    >>> fd.seek(0)
    >>> fd.read(4)
    'abcd'
    >>> fd.close()
    Je n'ai aucune erreur... et le fichier contient bien "abcd"

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Après un test supplémentaire, c'est le fd.read() qui provoque l'erreur, on ne peut apparemment plus écrire après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> fd = open("tmp.txt", "r+b") #même fichier que dans le post précédent
    >>> fd.write("aaaaa")
    >>> fd.seek(0, 2)
    >>> fd.write('b')
    >>> fd.seek(0)
    >>> fd.read()
    'aaaaab'
    >>> fd.write('a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IOError: [Errno 0] Error
    Pourtant il faut que je lise mon fichier de table... Quelqu'un aurait-il une idée? (en évitant de préférence fermeture/réouverture car il se peut que cette fonction prenne pas mal de temps, donc autant ne pas en prendre davantage)

    EDIT: Apparemment read puis write immédiatement après, python n'aime pas, idem pour l'inverse, mais avec un seek entre, aucun problème...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 89
    Points : 107
    Points
    107
    Par défaut tu es a la fin du fichier !
    il te manque un fd.seek(), afin de repositionner ton 'curseur' et pouvoir écrire de nouveau

    @++

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    En effet, c'était ça, c'est bon à savoir, de plus ça m'a permis de me rendre compte que ma fonction IsPrime envoyait le curseur de fichier à un endroit quelconque, endroit auquel j'écrivais ensuite mes résultats...

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

Discussions similaires

  1. [FreeBSD] Problème lors d'une mise à jour
    Par gentox dans le forum BSD
    Réponses: 2
    Dernier message: 15/11/2006, 18h44
  2. Problème lors de la mise à jour
    Par Invité dans le forum Access
    Réponses: 2
    Dernier message: 05/06/2006, 09h22
  3. [MySQL] Les champs sont vides lors d'une mise à jour (update)
    Par gregos13 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 26/04/2006, 08h01
  4. violation de la règle de validation lors d'une mise à jour
    Par courtial dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/03/2006, 15h17
  5. Réponses: 2
    Dernier message: 21/12/2005, 13h08

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