Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vérifier chaine de caractère dans un fichier

Python

Sujet résolu
    15 juillet 2019 à 16:51:50

    Bonjour, 

    Je souhaite vérifier une chaine de caractères dans un fichier xml. Si cette chaine est trouvé, je souhaite fermé ce ficher et arrêter la fonction. Cependant, j'ai une erreur : 

      File "/var/lib/odoo/projects/Odoo/ecole/models/files_onde.py", line 227, in write_in_file_six

        f.write(contents)

    IOError: [Errno 9] Mauvais descripteur de fichier


    Voici le code : 

    ...
        file_six = "/files/xml/"+folder+"/responsables.xml"
        modified = os.path.getmtime(file_six)
        modified_date = datetime.datetime.fromtimestamp(modified)
        day_date = datetime.datetime.today()
    
        f = open(file_six, "r")
        contents = f.readlines()
        f.close()
    
        mode = 'w'
        if day_date.day != modified_date.day:
            xml = xml_head + xml + xml_footer
            with open(file_six, mode) as f:
                f.write(xml)
        else:
            contents.insert(7, xml)
            f = open(file_six, 'rw')
            contents = "".join(contents)
            for line in f:
                if numeroresponsableext in line:
                    f.close()
                    return
            f.write(contents)
        f.close()
    

    Merci pour votre aide ! 

    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2019 à 17:18:02

      KévinH a écrit:

      Je souhaite vérifier une chaine de caractères dans un fichier xml. Si cette chaine est trouvé, je souhaite fermé ce ficher et arrêter la fonction.

      1er problème : ça, c'est ce que fait ta fonction entre les lignes 7 et 9 de ton post. L'erreur, elle, se produit à la ligne 24 qui fait complètement autre chose.

      2ème problème :

      f = open(file_six, 'rw')

      L'erreur vient de là.
      N'essaye pas d'ouvrir avec le mode 'rw'.
      Ouvre le fichier en lecture, lis ce que tu veux dedans, ferme-le, décide de ce que tu veux écrire... et là seulement, tu l'ouvres en écriture.

      Une remarque pour la route : utilise systématiquement la syntaxe with, ça te garantit la fermeture du fichier même si le programme plante.

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        15 juillet 2019 à 17:18:25

        Le mode "rw" n'existe pas. Il est d'ailleurs étonnant que ton OS attende la tentative d'écriture pour te le signaler au-lieu de le dire à l'ouverture...

        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2019 à 10:42:34

          Merci à vous, j'ai trouvé la solution : 

              file_six = "/files/xml/"+folder+"/responsables.xml"
              modified = os.path.getmtime(file_six)
              modified_date = datetime.datetime.fromtimestamp(modified)
              day_date = datetime.datetime.today()
          
              f = open(file_six, "r")
              contents = f.readlines()
              f.close()
          
              mode = 'w'
              if day_date.day != modified_date.day:
                  xml = xml_head + xml + xml_footer
                  with open(file_six, mode) as f:
                      f.write(xml)
              else:
                  with open(file_six, 'r') as f:
                      for line in f:
                          if numeroresponsableext in line:
                              return
                  contents.insert(7, xml)
                  f = open(file_six, mode)
                  contents = "".join(contents)
                  f.write(contents)
              f.close()



          • Partager sur Facebook
          • Partager sur Twitter
            16 juillet 2019 à 12:11:36

            J'ai la flemme d'expliquer pourquoi mais il faut toujours utiliser le with quand on ouvre un fichier :

            file_six = "/files/xml/"+folder+"/responsables.xml"
            modified = os.path.getmtime(file_six)
            modified_date = datetime.datetime.fromtimestamp(modified)
            day_date = datetime.datetime.today()
             
            with open(file_six, "r") as f:
                contents = f.readlines()
             
            if day_date.day != modified_date.day:
                xml = xml_head + xml + xml_footer
                with open(file_six, "w") as f:
                    f.write(xml)
            else:
                with open(file_six, 'r') as f:
                    for line in f:
                        if numeroresponsableext in line:
                            return
                contents.insert(7, xml)
                with open(file_six, "w") as f:
                    contents = "".join(contents)
                    f.write(contents)
            


            Et puis je l'ai déjà dit mais prends le temps d'apprendre à utiliser le module lxml, tu me remercieras plus tard.

            • Partager sur Facebook
            • Partager sur Twitter

            Vérifier chaine de caractère dans un fichier

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown