Python os.rename()失败,正在被另一个进程使用

Python os.rename()失败,正在被另一个进程使用,python,file,Python,File,所以我试图重命名一个文件,它一直说“进程无法访问该文件,因为它正被另一个进程使用。”但我知道它没有被另一个进程使用,所以我不确定发生了什么。这是我的密码 while self.fileSet.hasMoreFiles(): file = self.fileSet.nextFile() periodIndex=file.find(".") extension = file[periodIndex:] baseName=file[:periodIndex] s

所以我试图重命名一个文件,它一直说“进程无法访问该文件,因为它正被另一个进程使用。”但我知道它没有被另一个进程使用,所以我不确定发生了什么。这是我的密码

while self.fileSet.hasMoreFiles():
    file = self.fileSet.nextFile()
    periodIndex=file.find(".")
    extension = file[periodIndex:]
    baseName=file[:periodIndex]
    self.newFile=open(file, 'w+')
    self.backupName = baseName + "_bak" + extension
    os.rename(file, baseName + "_bak" + extension)
    self.newFile=open(file, 'w+')
    self.writeNew()

在尝试调用
os.rename
之前,先打开文件两行,但在尝试重命名之前,您没有关闭它,因此您自己的程序仍将其打开

os.rename()
之前调用
self.newFile.close()
,您应该避免这个错误——或者更好的是,在重命名之前,不要调用
open()
,因为您实际上并没有使用打开的文件(并且在重命名之后立即打开它)


一些切题的注释:

  • 您不应该命名变量
    文件
    ——如果您这样做,已经有一个名为
    文件
    的类型正在隐藏

  • 您复制了很多代码—例如,您刚刚在重命名上方的行上创建了
    self.backupName
    ,但随后您重新计算了它。为什么不将
    self.backupName
    作为第二个参数传递给
    os.rename()

  • 您可以使用跳过
    find
    调用和后续切片

总之,您可以将代码压缩为:

while self.fileSet.hasMoreFiles():
    curFile = self.fileSet.nextFile()
    baseName, extension = os.path.splitext(curFile)
    self.backupName = baseName + "_bak" + extension
    os.rename(curFile, self.backupName)
    self.newFile = open(curFile, 'w+')
    self.writeNew()

“但我知道它没有被另一个过程使用”-你怎么知道的?你查过了吗?这回答了我的问题,还有一些。哈,重复/不太好的代码是我昨晚试图完成的结果。但是谢谢你的帮助,这对我来说是一件愚蠢的事情。我在函数开始时尝试在golang中使用
延迟myFile.Close()
重命名
。然而,在运行
defer
之前,我试图在该函数中重命名。这个答案帮助了我。在调用
os.Rename()
之前,我执行了
myFile.Close()
。尽管在Linux上测试时一切运行正常,但在Windows中无法重命名。谢谢你的主意。