当前位置: 首页 > 知识库问答 >
问题:

进程无法访问文件,因为它正被另一个进程使用:

羊越
2023-03-14

我的脚本搜索特定目录中的所有pdf文件,然后从pdf中提取一个id,并在文件中组织pdf。例如我有:

C:\Users\user\Downloads\aa\1.pdf, with id = 3,
C:\Users\user\Downloads\aa\2.pdf, with id = 5,
C:\Users\user\Downloads\aa\3.pdf, with id = 10

我想这样组织它们:

C:\Users\user\Downloads\aa\3\1.pdf
C:\Users\user\Downloads\aa\5\2.pdf
C:\Users\user\Downloads\aa\10\3.pdf

下面的脚本做的工作,但我认为只有最后一个文件输出以下错误:

回溯(最近一次调用):文件“C:\Users\user\Downloads\aa\project.py”,第74行,在操作系统中。rename(source,dest)PermissionError:[WinError 32]该进程无法访问该文件,因为另一个进程正在使用该文件:“C:\Users\user\Downloads\aa\3”。pdf'-

 import PyPDF2
 import re
 import glob, os
 import shutil
 import sys
 from collections import Counter
 from collections import defaultdict

 class DictList(dict):
     def __setitem__(self, key, value):
         try:
             self[key].append(value)
         except KeyError:
             super(DictList, self).__setitem__(key, value)
         except AttributeError:
             super(DictList, self).__setitem__(key, [self[key], value])

 files = glob.glob(r'C:\Users\user\Downloads\aa\*.pdf')

 gesi_id=[]
 dic = DictList()

 c = 0

 for i in files:   
     pdfFileObj = open(files[c],'rb')
     pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
     num_pages = pdfReader.numPages
     count = 0
     text = ""

 while count < num_pages:
     pageObj = pdfReader.getPage(count)
     count +=1
     text += pageObj.extractText()

 keywords = []
 keywords = re.findall(r'[0-9]\w+', text); 
 gesi_id.append(keywords[0])
 key = str(gesi_id[c])
 value = files[c]
 dic[key] = value
 c=c+1

 gesi_id_unique = []
 for x in gesi_id: 
         if x not in gesi_id_unique: 
             gesi_id_unique.append(x) 

 c=0
 if not gesi_id_unique:
   sys.exit()

 for i in gesi_id_unique:
     dirName = os.path.join('C:\\Users\\user\\Downloads\\aa\\', 
 str(gesi_id_unique[c]))
     c=c+1

     if not os.path.exists(dirName):
         os.mkdir(dirName)

 keys = list(dic)
 values = list(dic.values())
 k = 0
 v = 0
 for i in keys:
     for val in values[k]:
         source = val


          dest = os.path.join('C:\\Users\\user\\Downloads\\aa\\', 
 gesi_id_unique[k],  val.rsplit('\\', 1)[-1])
         print(gesi_id_unique[k])
         print(val.rsplit('\\', 1)[-1])
         print("Source: %s"  % source)
         print("Dest: %s" % dest)
          os.rename(source, dest)
     k = k+1

共有1个答案

郭和硕
2023-03-14

首先,我认为由于复制和过去的一些缩进受到干扰,事实上有一部分应该是:

for i in files:   
     pdfFileObj = open(files[c],'rb')
     pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
     num_pages = pdfReader.numPages
     count = 0
     text = ""

     while count < num_pages:
          pageObj = pdfReader.getPage(count)
          count +=1
          text += pageObj.extractText()

      keywords = []
      keywords = re.findall(r'[0-9]\w+', text); 
      gesi_id.append(keywords[0])
      key = str(gesi_id[c])
      value = files[c]
      dic[key] = value
      c=c+1

为了解决这个问题,您只需要通过添加pdfFileObj来关闭当前使用的文件。关闭()

for i in files:   
     pdfFileObj = open(files[c],'rb')
     pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
     num_pages = pdfReader.numPages
     count = 0
     text = ""

     while count < num_pages:
          pageObj = pdfReader.getPage(count)
          count +=1
          text += pageObj.extractText()

      keywords = []
      keywords = re.findall(r'[0-9]\w+', text); 
      gesi_id.append(keywords[0])
      key = str(gesi_id[c])
      value = files[c]
      dic[key] = value
      c=c+1
      pdfFileObj.close()

 类似资料:
  • 我是C#新手,连接Firebird数据库时遇到问题。我想让我的程序访问Firebird数据库[FDB格式文件]。我有问题,请参见下面的代码: 这段代码允许我读取FDB文件并提取数据。当代码第一次执行时,没有错误或问题,但是当我再次执行时,这个错误会显示出来: 进程无法访问文件“C:\Users\ACC-0001”。FDB’因为它正被另一个进程使用。

  • 下面是使用Ucanaccess Jdbc驱动程序从Microsoft Access文件filename.accdb获取连接的代码。但在运行此代码时,它会抛出异常,就像已经使用的文件一样。 但是我想在其他应用程序使用MSAccess数据库文件时并发地使用它。 当我运行上面的代码时,出现了如下异常: net.ucanaccess.jdbc.ucanaccesssqlexception:UCAEXC::

  • 问题内容: 我的代码用于一个脚本,该脚本查看一个文件夹并删除分辨率为1920x1080的图像。我的问题是我的代码运行时; 我收到此错误消息: 只需确认一下,Python是我计算机上运行的唯一程序。是什么导致此问题,我该如何解决? 问题答案: 您的过程就是打开文件的过程(仍然存在)。您需要先关闭它,然后再删除它。 我不知道PIL是否支持上下文,但是是否支持: 进入之前,请确保删除(并关闭文件)。 如

  • 我是编程新手,我有一个问题。如果我有两个函数,一个创建一个文本文件并写入其中,而另一个打开同一个文本文件并从中读取。 我得到的错误是: 系统伊奥。IOException:'进程无法访问文件'@。txt“因为它正被另一个进程使用。” 我曾尝试为每个功能设置单独的计时器,但仍然不起作用。我认为最好的办法是函数二直到函数一结束才开始。 你能帮我实现这个吗?非常感谢!迈克 源代码:

  • 我刚使用System.io,我不明白为什么我的代码会导致这个异常。我想检查一个目录和一个文件是否存在,如果不存在,我想创建它们。之后,我想在我刚创建的文件上写点东西。在这里它抛出异常。我非常确信,当im试图使用StreamWriter时,创建会导致异常,因为如果该文件已经存在,我不会得到一个执行。此外,当我在一次尝试失败后再次单击调用此funktion的按钮时,没有任何例外,并且一切都运行良好(看