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.
3 Réponses :
Essayez de fermer le fichier result.txt avant d'exécuter le programme (je l'ouvrirais).
Vérifiez les autorisations d'écriture.
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é.
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).
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é.
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
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é