首页 > 编程问答 >为什么我会收到 Python IOError: [Errno 13] 写入文件时权限被拒绝?

为什么我会收到 Python IOError: [Errno 13] 写入文件时权限被拒绝?

时间:2024-07-27 11:13:46浏览次数:12  
标签:python python-2.7 ioerror

我不明白我做错了什么。我正在运行一些测试并将结果写入文件。写入文件的代码部分如下(在名为 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] 权限被拒绝错误通常发生在尝试在没有必要权限的情况下写入文件或目录时发生。似乎已经涵盖了基本知识(检查权限,验证路径),所以让我们深入研究一些可能导致此问题的不太明显的原因以及如何诊断它们:

可能的罪魁祸首和调试技巧

  1. 文件锁定: 如果的代码的其他部分或另一个进程在尝试写入时正在使用该文件,则可能会遇到权限被拒绝错误。这在 Windows 上尤其常见,Windows 会强制执行更严格的文件锁定。

  2. 调试: 仔细检查的代码以确保没有在其他地方打开该文件并忘记关闭它。考虑使用调试器或在写入操作前后添加打印语句,以查看文件在何时何地被访问。

  3. 防病毒软件: 过于热心的防病毒软件可能会干扰文件操作。某些防病毒程序会实时扫描和锁定文件,从而导致写入尝试失败。

  4. 调试: 暂时禁用的防病毒软件或将其配置为排除的项目目录,以查看这是否是问题所在。

  5. 文件系统问题: 尽管很少见,但文件系统错误或损坏可能会导致此类错误。

  6. 调试: 尝试在的系统上运行文件系统检查工具(例如,Windows 上的 chkdsk 或 Linux 上的 fsck )。

  7. 网络驱动器上的权限问题: 如果正在写入网络驱动器上的文件,则权限问题可能会更加复杂,具体取决于网络配置和的特定权限。

  8. 调试: 尝试将文件写入本地驱动器,以查看问题是否仍然存在。如果是这样,则问题很可能出在网络权限上。

针对更新代码的附加说明

提供的更新后的代码中仍然存在潜在的竞争条件。在 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

相关文章

  • 为什么当我在 cmd 中输入 python - -version 时,除了空行之外什么都没有出现?
    我已经下载了python3.9。但是,在通过命令行检查版本时,我确实得到了一个空行而不是版本。我在cmd上使用了以下命令:python--version有几个原因可能会导致在cmd中输入python--version时只出现空行。以下是一些可能的解决方法:1.Python没有添加到......
  • Python爬虫技术 第16节 XPath
    XPath是一种在XML文档中查找信息的语言,尽管XML和HTML在语法上有区别,但XPath同样适用于HTML文档的解析,尤其是在使用如lxml这样的库时。XPath提供了一种强大的方法来定位和提取XML/HTML文档中的元素和属性。XPath基础XPath表达式由路径表达式组成,它们指定了文档中的位置。下......
  • 如何从Python中的“openpyxl”饼图中删除“Series1”标签?
    我正在使用openpyxl创建一个包含饼图的Excel文件。但是,我似乎无法从图表中删除默认的“Series1”标签。为了更好的上下文,我已经包含了整个export_to_excel函数,但问题具体在于我创建饼图的分析表。defexport_to_excel(self):start_date=self.fromDate.date().toSt......
  • 在python3.8虚拟环境 执行pip 安装Excel的库
    1、在开始菜单打开Anacondaprompt(anaconda3) 2、查看环境列表 3、进入虚拟环境 4、在虚拟换进下使用清华源安装读取excel的库和写入excel的库读取Excel文件的库:pipinstallxlrd-ihttps://pypi.tuna.tsinghua.edu.cn/simple 写入Excel文件的库:pipinstallxlwt......
  • Python Pandas 使用 .loc 跨列级别多重索引
    我对python和pandas仍然很陌生,想知道是否有更好的方法来解决我遇到的索引问题。因为我看到人们在这个网站上做了非常巧妙的事情,超出了我通常可以从文档中收集到的内容,所以我想我会问——特别是因为我还在学习。我有一个包含多个列的DataFrame级别,级别0是“meta”和“r......
  • Python、Scapy 并导出到 .exe
    目前我会玩一点scapy、Qt和python。到目前为止,使用VSC启动程序时一切正常。现在我尝试使用PyInstaller制作.exe。它也有效,我得到了一个.exe文件,可以打开它并显示我的Qt-Windows。但是当我使用scapy函数时,程序崩溃,没有任何消息,并且窗口关闭。我激活了日志记录并发......
  • 使用 python 检测鼠标是等待还是忙碌
    我正在用Python2.7创建一个脚本。该脚本在应用程序内自动执行鼠标单击。有一些情况,在单击鼠标后,鼠标光标将“等待”,我想等到鼠标光标恢复正常后再进行操作我进入代码中的下一步。Python中是否可以检测鼠标是否正在等待?在Python中没有内置方法可以检测......
  • ValueError:在带有 GATT 的 Python 中,以 16 为基数的 int() 的文字无效:b'0f 18 '
    我正在使用Python和GATT库pxexpect来处理一些数据,但在尝试将十六进制值转换为整数时遇到问题。这是我看到的具体错误:print(int(gatt.before,16)),^^^^^^^^^^^^^^^^^^^^ValueError:invalidliteralforint()withbase16:b'0f18'这是产生错误的代......
  • 我看不懂这个python脚本?
    用于加载.dat文件的Python脚本importcsvfromdjango.core.management.baseimportBaseCommandfromrecommender.modelsimportUser,Artist,Tag,UserArtist,UserTaggedArtist,UserFriendimportosfromdjango.confimportsettings#Definethepathtothedatab......
  • 使用操作系统工具通过 Python 3 扫描图像
    我正在使用python构建一个应用程序,它需要能够连接到扫描仪并处理生成的pdf/jpeg/其他文件中的数据。我一直在尝试找到一种连接到扫描仪以请求扫描的方法,但没有真正的进展。我已经查看了我能找到的所有选项,包括这个答案:我想连接我的图像扫描仪程序我发现的大多......