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
rwxdu 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.txtest-rw ------- 1 utilisateur utilisateurs 8346 5 février 15:10 dossier / results.txtAvez-vous proposé quelque chose de nouveau?
@DanielReyhanian Oui, jetez un œil au post édité