0
votes

Pourquoi est-ce que j'obtiens Python IOError: [Errno 13] Autorisation refusée lors de l'écriture dans un fichier?

Je n'arrive pas à comprendre ce que je fais de mal. J'exécute des tests et j'écris les résultats dans un fichier. La partie du code qui écrit dans un fichier est la suivante (dans une classe appelée Tester):

# Opens the results file                                                                                                                                                                            
with open(resultsFileName,"a") as file:
     if file.tell() == 0:
         # Prints the header                                                                                                                                                                         
         file.write("Header")
         # Prints the results                                                                                                                                                                        
         file.write(otherArguments)
         file.close()
      else:

         # Prints the results
         file.write(otherArguments)                                                                                                                                                                        
         file.close()

Parfois, j'obtiens cette erreur:

  @staticmethod
  def printResults(resultsFileName,otherArguments):

    # Prints the header if it does not exist                                                                                                                                                                                                                                                                                                                            
    if not os.path.exists(resultsFileName):

        # The file does not exist, thus                                                                                                                                                                                                                                                                                                                                 
        # we need to print the header                                                                                                                                                                                                                                                                                                                                   

        # Opens the results file               
        # HERE IS WHERE ERRNO 13 HAPPENS
        # STRANGELY, THE FILE DOES EXIST 
        # AS SEVERAL LINES OF RESULTS 
        # HAVE ALREADY BEEN WRITTEN                                                                                                                                                                                                                                                                           
        with open(resultsFileName,"w") as file:

            # Prints the header                                                                                                                                                                                                                                                                                                                                         
            file.write("A suitable header")
            # Prints the results                                                                                                                                                                                                                                                                                                                                        
            file.write(otherArguments)
    else:

        # Prints the results                                                                                                                                                                                                                                                                                                                                            
        with open(resultsFileName,"a") as file:
            file.write(otherArguments)   

tandis que d'autres fois, il fonctionne bien. Je n'arrive pas à comprendre où est le problème. Des idées?

REMARQUE1 : J'ai l'autorisation rwx sur le répertoire où le fichier est écrit. REMARQUE2 : l'erreur se produit après l'écriture de plusieurs lignes de résultats. Ainsi, cela se produit lorsque le code vérifie si l'en-tête doit être imprimé ou non (mais il n'est pas censé l'imprimer, puisque le fichier existe).

MISE À JOUR 1 :

Comme suggéré, j'ai changé mon code pour éviter d'ouvrir et de fermer le fichier plusieurs fois. Maintenant, il écrit tout en un seul coup. Voici le code mis à jour:

Traceback (most recent call last):
  File "main.py", line 74, in <module>
  File "tester.py", line 88, in methodOne
  File "tester.py", line 441, in printResults
  File "tester.py", line 428, in printHeader
IOError: [Errno 13] Permission denied: 'results.txt'

Il semble que os.path.exists () renvoie à un moment donné FALSE même si le fichier existe. Il y a probablement quelque chose qui me révoque l'autorisation d'écrire (peut-être que le fichier n'est pas correctement fermé après l'écriture?).

L'explication de os.path.exists () dit que:

Sur certaines plates-formes, cette fonction peut retourner False si l'autorisation n'est pas accordée d'exécuter os.stat () sur le fichier demandé, même si le chemin existe physiquement.

MISE À JOUR 2

J'ai changé mon code comme suit, pour éviter os.path.isfile () :

 @staticmethod
 def printHeader(resultsFileName):
        if not os.path.isfile(resultsFileName):
            # The file does not exist, thus
            # we need to print the header

            # Opens the results file
            with open(resultsFileName,"a") as file:
                # Prints the header 
                file.write("A long header")


@staticmethod
def printResults(resultsFileName,otherArguments):

    # Prints the header if it does not exist
    Tester.printHeader(resultsFileName)

    # Prints the results
    with open(resultsFileName,"a") as file:

        file.write(otherArguments)

Néanmoins, ERRNO 13 se produit à avec open (resultsFileName, "a") comme fichier: . J'ai des autorisations rw à la fois sur le dossier et sur le fichier, sur lesquels plusieurs lignes sont écrites avant que l'erreur ne se produise. Le système d'exploitation est Linux.


9 commentaires

Avez-vous vérifié l'autorisation du répertoire dans lequel le programme essaie d'écrire?


Cela signifie généralement que le fichier est ouvert


Lorsque le fichier n'existe pas, au lieu d'utiliser le mode «a» pour ajouter, essayez d'utiliser le mode «w» pour l'écriture. Le comportement que j'éprouve est que «a» créera le fichier et l'ajoutera correctement, mais cela vaut la peine d'essayer. Peut-être que dans votre système, l'ajout échoue si le fichier n'existe pas, mais réussit toujours à le créer sur le disque.


@hansolo J'ai les permissions rwx du répertoire. J'ai édité la question en conséquence.


@RaamEE J'ai changé «a» en «w» dans la méthode printHeader et j'ai exécuté quelques tests.


Pouvez-vous coller "ls -l results.txt"? Vous pouvez avoir accès au répertoire, mais pas au fichier, par exemple: ebajgrz @ IE-00001696: / tmp $ mkdir dir ebajgrz @ IE-00001696: / tmp $ chmod 777 dir ebajgrz @ IE-00001696: / tmp $ touch dir / fichier ebajgrz @ IE-00001696: / tmp $ sudo chmod 000 dir / fichier ebajgrz @ IE-00001696: / tmp $ echo test> dir / fichier bash: dir / fichier: Autorisation refusée


@gbajson le résultat de ls -l results.txt est -rw ------- 1 utilisateur utilisateurs 8346 5 février 15:10 dossier / results.txt


Avez-vous proposé quelque chose de nouveau?


@DanielReyhanian Oui, jetez un œil au post édité


3 Réponses :


0
votes
  1. Essayez de fermer le fichier result.txt avant d'exécuter le programme (je l'ouvrirais).

  2. Vérifiez les autorisations d'écriture.

  3. Une autre cause peut être l'écriture dans un fichier .txt dans un répertoire sans ces autorisations. Essayez d'exécuter python à partir du répertoire spécifié.


3 commentaires

L'erreur se produit également si j'ajoute un file.close () après file.write () . J'ai vérifié les permissions du dossier et du fichier, et j'ai la permission d'écrire dans le dossier et sur le fichier.


@ZzKr Essayez d'exécuter l'interpréteur / IDE en tant qu'administrateur?


@ZzKr Une autre suggestion est de vérifier votre chemin. C'est peut-être faux? Ce n'est peut-être pas le plein? (essayez d'inclure ceux qui semblent assez évidents, par exemple C: \ Windows).



0
votes

os.path.isfile (chemin) renvoie Vrai si le chemin existe ET est un fichier ET vous avez (au moins) des autorisations de lecture sur celui-ci. IOW, il renvoie False si le chemin existe mais est un répertoire et / ou si vous n'avez pas les autorisations dessus. Donc, votre test est faux depuis le début - os.path.exists () serait un meilleur choix. Mais de toute façon: ces opérations ne sont pas atomiques, donc le fichier pourrait bien être créé entre le moment où vous testez son existence et le moment où vous essayez de l'ouvrir, donc la conception entière est en fait dangereuse. En outre, déclarer, ouvrir et fermer un fichier sont toutes des opérations coûteuses, je vous suggère donc - si possible - de repenser l'ensemble de votre conception pour ouvrir un fichier une seule fois et ne le fermer qu'une fois lorsque vous avez terminé.


0 commentaires

0
votes

Vous pouvez vérifier si le fichier est ouvert avec un autre programme. Si tel est le cas, vous pouvez essayer de les fermer tous.

Salut! Cela fonctionnera sûrement


0 commentaires