我不明白我做错了什么。我正在运行一些测试并将结果写入文件。写入文件的代码部分如下(在名为 Tester 的类中):
@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)
有时我会收到此错误:
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'
而其他时候它运行顺利。我无法弄清楚问题出在哪里。有什么想法吗?
NOTE1
:我对写入文件的目录有
rwx
权限。
NOTE2
:在写入几行结果后发生错误。因此,当代码检查是否应该打印标题时会发生这种情况(但不应该打印它,因为文件存在)。
更新1 :
按照建议,我有更改了我的代码以避免多次打开和关闭文件。现在它一口气写下了所有内容。这是更新后的代码:
@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)
似乎
os.path.exists()
在某些时候返回
FALSE
即使文件确实存在。可能有什么东西撤销了我的写入权限(也许写入后文件没有正确关闭?)。
os.path.exists()
的解释是这样的:
在某些平台上,如果权限是,此函数可能会返回 False未授予对请求的文件执行 os.stat() 的权限,即使路径物理存在。
更新 2
我已将代码更改为以下内容,以避免
os.path.isfile()
:
# 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()
尽管如此,ERRNO 13 发生在
with open(resultsFileName,"a") as file:
我对文件夹和文件都有
rw
权限,在错误发生之前在文件上写入了几行。操作系统是Linux。
这个 Python IOError:[Errno 13] 权限被拒绝错误通常发生在尝试在没有必要权限的情况下写入文件或目录时发生。似乎已经涵盖了基本知识(检查权限,验证路径),所以让我们深入研究一些可能导致此问题的不太明显的原因以及如何诊断它们:
可能的罪魁祸首和调试技巧
-
文件锁定: 如果的代码的其他部分或另一个进程在尝试写入时正在使用该文件,则可能会遇到权限被拒绝错误。这在 Windows 上尤其常见,Windows 会强制执行更严格的文件锁定。
-
调试: 仔细检查的代码以确保没有在其他地方打开该文件并忘记关闭它。考虑使用调试器或在写入操作前后添加打印语句,以查看文件在何时何地被访问。
-
防病毒软件: 过于热心的防病毒软件可能会干扰文件操作。某些防病毒程序会实时扫描和锁定文件,从而导致写入尝试失败。
-
调试: 暂时禁用的防病毒软件或将其配置为排除的项目目录,以查看这是否是问题所在。
-
文件系统问题: 尽管很少见,但文件系统错误或损坏可能会导致此类错误。
-
调试: 尝试在的系统上运行文件系统检查工具(例如,Windows 上的
chkdsk
或 Linux 上的fsck
)。 -
网络驱动器上的权限问题: 如果正在写入网络驱动器上的文件,则权限问题可能会更加复杂,具体取决于网络配置和的特定权限。
-
调试: 尝试将文件写入本地驱动器,以查看问题是否仍然存在。如果是这样,则问题很可能出在网络权限上。
针对更新代码的附加说明
提供的更新后的代码中仍然存在潜在的竞争条件。在
os.path.exists()
检查和
open()
调用之间,另一个进程或代码的一部分可能会创建该文件,从而导致权限被拒绝错误。
建议
-
使用 try-except 块: 将的文件写入操作包装在
try-except
块中,以优雅地处理IOError
。这将允许的代码在出现权限问题时继续运行或采取替代措施。 -
记录错误: 在的
except
块中,记录错误消息和任何相关上下文(例如,文件名、尝试执行的操作)。这将帮助在将来调试问题。
以下是如何实现这些建议的示例:
import os
def printResults(resultsFileName, otherArguments):
try:
with open(resultsFileName, "a") as file:
if file.tell() == 0:
file.write("Header\n")
file.write(otherArguments + "\n")
except IOError as e:
print(f"写入文件时出错:{e}")
# 这里添加额外的错误处理,例如记录错误或尝试不同的操作。
通过仔细检查这些可能性并系统地排除它们,应该能够确定导致 Python IOError 的根本原因:[Errno 13] 权限被拒绝错误并实现适当的解决方案。
标签:python,python-2.7,ioerror From: 54530819