Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python builtins.permissionerror,但没有文件?_Python_Python 3.x_File Io_In Place - Fatal编程技术网

Python builtins.permissionerror,但没有文件?

Python builtins.permissionerror,但没有文件?,python,python-3.x,file-io,in-place,Python,Python 3.x,File Io,In Place,我试图使用fileinput模块对文件进行就地编辑,但它似乎不起作用 我正在使用的代码: for line in fileinput.FileInput(complaint_db, inplace=True, backup=(complaint_db + ".backup")): print("Started replacement") if line == myline: pass else

我试图使用fileinput模块对文件进行就地编辑,但它似乎不起作用

我正在使用的代码:

for line in fileinput.FileInput(complaint_db, inplace=True, backup=(complaint_db + ".backup")):
            print("Started replacement")
            if line == myline:
                pass
            else:
                print(line)
备份参数被修改了,因为我认为它可能会修复错误,但它没有。在我运行此命令之前(我已经检查了100次)该文件不存在,之后也不存在。我正在我的主目录中创建文件,所以应该没有错误

以下是全部错误:

builtins.PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'c:\\Users\\Cody\\Documents\\ComplaintManagement\\complaints.dbc:\\Users\\Cody\\Documents\\ComplaintManagement\\complaints.db.backup'
我想另一个问题是,如何检查原始投诉.db是否在文件中的某个位置打开,而不知道它可能在哪里打开。如果是这样的话,我能在代码中任意一点随意关闭它吗


我不能执行f.close,因为此时代码中不会定义f。我尝试了os.close(complaint_db)(complaint_db是保存数据库位置的通用变量)。它不起作用,因为它需要一个int,所以我现在有点迷路了。

我通过使用不同形式的更改数据库来解决这个问题。我将其更改为以下代码,而不是fileinput:

from shutil import move
def RemoveClaim(self, myline):
     ocdb = open(complaint_db, 'r')
     ncdb = open(complaint_db + "2", 'w')
     for line in ocdb:
         if line == myline:
             pass
         else:
             ncdb.write(line)
     ocdb.close()
     ncdb.close()
     move(complaint_db + "2", complaint_db)

这似乎解决了我的问题,因为它可以正常工作,我没有任何错误。

看起来您的文件名/路径构建不正确-异常文本显示两个文件名连接在一起(
c:\…\complaints.dbc:\…\complaints.db.backup
),我希望那里应该只有一个。@AndrewMedico:确实如此。我修复了这个问题。@eryksun:我修复了最初的错误,但是我的脚本没有其他正在运行的实例,并且文件不存在。这是工作目录的屏幕截图:如您所见,complaints.db.bak不存在。我不知道为什么会这样。它不是只读的,没有运行我的软件的其他实例,我将所有原始的
open
语句更改为
with open
语句。而且,即使以管理员身份运行cmd,然后用它运行程序也不起作用。在我之前的评论中,我所说的“原始错误”是指第一个错误。对于一行中的所有评论,我深表歉意。5分钟后无法编辑。重新启动并不能解决这个问题,这让我相信它在我的代码中的某个地方。如果文件处于打开状态,是否有一种通用的关闭方法?比如unlocker(软件)做什么?最奇怪的是,我仍然可以随时移动db,而且unlocker没有显示锁紧手柄,即使我的程序由于某个原因停止。尝试
os.replace(投诉\u db+“2”,投诉\u db)
而不是
shutil.move
,要查看它是否引发了
权限错误
@eryksun,实际上它是引发权限错误的其中一个。它引发“WinError 5”
builtins.PermissionError:[WinError 5]访问被拒绝:“c:\\Users\\Cody\\Documents\\MEGA\\ComplaintManagement\\complaints.db”
然后complaints.db肯定是打开的。在本例中,
shutil.move
将complaints.db2的内容复制到complaints.db。这是允许的(假设complaints.db未被锁定),而在这种情况下禁止彻底的
重命名
替换
、或
取消链接
(删除)。复制操作不是原子操作,所以我认为您应该关注数据损坏。埃里克森:这有点令人沮丧。我在代码中找不到它仍然打开的任何地方,其他任何地方都没有打开它。有没有办法验证它是否打开?如果是,有没有办法强制关闭它?