【问题标题】:python 2 [Error 32] The process cannot access the file because it is being used by another processpython 2 [错误 32] 进程无法访问该文件,因为它正被另一个进程使用
【发布时间】:2016-10-19 12:05:50
【问题描述】:

我正在使用 python 2 并阅读了几篇关于此错误的帖子,即 (this post)。 但是,我仍然收到错误消息。 我要做的是: 我读取目录中的文件,如果任何文件包含特定字符串,则删除该目录。

def select_poo():
path = os.walk('/paila_candonga/')
texto = 'poo'
extension = '.tex'
for root, dirs, files in path:
    for documento in files:
        if extension in documento:
            with open(os.path.join(root, documento), 'r') as fin:
                for lines in fin:
                    if texto in lines:
                        shutil.rmtree(root)
                    else:
                        continue

然后我得到错误:

WindowsError: [Error 32] The process cannot access the file because it is being used by another process

我也尝试过使用绝对路径:

def select_poo():
path = os.walk('/paila_candonga/')
texto = 'poo'
extension = '.tex'
for root, dirs, files in path:
    for documento in files:
        if extension in documento:
            with open(os.path.join(root, documento), 'r') as fin:
                for lines in fin:
                    if texto in lines:
                        route = (os.path.join(root, documento))
                        files = os.path.basename(route)
                        folder = os.path.dirname(route)
                        absolut= os.path.dirname(os.path.abspath(route))
                        todo = os.path.join(absolut, files)
                        print todo

                    else:
                        continue

然后我会得到:

C:\paila_candonga\la_Arepa.tex
C:\paila_candonga\sejodio\laOlla.tex
C:\paila_candonga\sejodio\laPaila.tex

如果我一次删除一个文件,使用相同的绝对路径和 os.remove(''),我不会有问题。如果我尝试使用 select_poo() 和 shutil.rmtree(folder) 或 os.remove(absolut) 一次删除所有文件,则会出现错误 32。

有没有办法可以循环遍历 todo 中的每个路径并删除它们而不会出现错误 32?

谢谢,

【问题讨论】:

    标签: python windows python-2.7 loops shutil


    【解决方案1】:

    它发生在这里:

    with open(os.path.join(root, documento), 'r') as fin:
    

    因此您的文件已打开并锁定,这就是您无法使用以下方法删除此文件夹的原因:

    shutil.rmtree(root)
    

    在这个语句中,你必须在with语句之外做

    【讨论】:

    • 谢谢亚历克斯,但它不起作用。错误依然存在 =(
    • @Chüngel 您确定没有在任何其他应用程序中打开此文件夹或此文件夹中的任何文件吗?
    • Alex,我对 Python 很陌生,但是如果我使用 os.remove(absolut) 删除文件,相同的文件将被删除而不会出现错误。所以我相信这个错误是由我同时删除所有文件时所遵循的过程引起的。正如您所建议的,我已经定义了一个变量 x = [] 然后如果在文档中找到该字符串,则路径将附加到 x。然后在 with 语句之外,我执行 os.remove(x[0]),但是我得到了完全相同的错误。您能否根据您的想法为我的代码推荐一个版本?
    • @Chüngel,Windows 在打开文件时使用共享模式。它是一种文件锁定,但是虽然 Windows 文件锁定允许强制锁定文件中的字节范围,但共享模式反而限制了对整个文件的共享读取、写入和删除访问。每次打开文件时,请求的访问和共享模式必须与文件的所有现有引用兼容。由于删除文件需要使用DELETE 访问权限打开它,因此必须事先关闭不共享删除访问权限的文件的所有句柄。
    • @Chüngel,这并不是说使用删除共享打开文件是使 Windows 表现得像典型的 POSIX 系统的一种方式。还有一条额外的规则:必须始终命名所有打开的文件,包括当文件被内存映射为代码或数据时(例如加载的 EXE 和 DLL)。即使“删除”,文件仍然链接在父目录中,直到所有句柄都关闭,并且始终拒绝尝试删除内存映射文件。一种可能的解决方法是首先将文件重命名为同一卷上的临时目录。
    猜你喜欢
    • 2021-09-28
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多