Python Wand在使用OCR转换PDF时使用Mac上的所有可用磁盘空间

问题描述:

我相信这是我的第一个StackOverflow问题,所以请好。Python Wand在使用OCR转换PDF时使用Mac上的所有可用磁盘空间

我正在对每个50-200页的PDF(总共约1GB)进行OCR处理,发现我的Macbook Pro上所有可用的100GB剩余硬盘空间都已消失。根据以前的帖子,ImageMagick似乎是here所示的罪魁祸首。

我发现这些文件被称为'magick- *'并存储在/ private/var/tmp中。只有23 PDF,它创造了总计181GB的3576个文件。

如何在不再需要代码后立即删除这些文件?提前感谢您提出任何解决此问题的建议。

下面是代码:

import io, os 
import json 
import unicodedata 
from PIL import Image as PI 
import pyocr 
import pyocr.builders 
from wand.image import Image 
from tqdm import tqdm 

# Where you want to save the PDFs 
destination_folder = 'contract_data/Contracts_Backlog/' 


pdfs = [unicodedata.normalize('NFKC',f.decode('utf8')) for f in os.listdir(destination_folder) if f.lower().endswith('.pdf')] 
txt_files = [unicodedata.normalize('NFKC',f.decode('utf8')) for f in os.listdir(destination_folder) if f.lower().endswith('.txt')] 


### Perform OCR on PDFs 
def ocr_pdf_to_text(filename): 
    tool = pyocr.get_available_tools()[0] 
    lang = 'spa' 
    req_image = [] 
    final_text = [] 
    image_pdf = Image(filename=filename, resolution=300) 
    image_jpeg = image_pdf.convert('jpeg') 
    for img in image_jpeg.sequence: 
     img_page = Image(image=img) 
     req_image.append(img_page.make_blob('jpeg')) 

    for img in req_image: 
     txt = tool.image_to_string(
      PI.open(io.BytesIO(img)), 
      lang=lang, 
      builder=pyocr.builders.TextBuilder() 
     ) 
     final_text.append(txt) 
    return final_text 

for filename in tqdm(pdfs): 
    txt_file = filename[:-3] +'txt' 
    txt_filename = destination_folder + txt_file 
    if not txt_file in txt_files: 
     print 'Converting ' + filename 
     try: 
      ocr_txt = ocr_pdf_to_text(destination_folder + filename) 
      with open(txt_filename,'w') as f: 
       for i in range(len(ocr_txt)): 
        f.write(json.dumps({i:ocr_txt[i].encode('utf8')})) 
        f.write('\n') 
      f.close() 
     except: 
      print "Could not OCR " + filename 

处理这个的哈克的方式是主回路中增加一个os.remove()语句创建后删除.tmp文件。

tempdir = '/private/var/tmp/' 
files = os.listdir(tempdir) 
    for file in files: 
     if "magick" in file: 
      os.remove(os.path.join(tempdir,file)) 

Image应作为一个上下文管理器,因为魔杖确定的时序来配置资源,包括临时文件,内存缓冲区,等等。 with块帮助魔杖知道这些Image对象仍然需要时,当他们现在是不必要的边界。请参阅official docs

+0

Imagemagick不应将任何文件保留在/ tmp中,除非该命令在处理过程中意外失败,例如/ tmp空间不足或内存不足。如果命令完成,则Imagemagick将自动删除这些文件,除非它没有正确的权限。检查您的资源限制。抱歉,我对Python魔杖本身知之甚少。 – fmw42

+0

@ fmw42当然Wand也可以处理这个问题。如果Python进程由于运行时错误而终止,或者正常退出Wand将释放它所做的所有资源。但是,如果Python进程运行时间很长,则只有在整个程序结束时才能处理这些资源。使用魔杖图像作为上下文管理器有助于确定在整个程序结束之前何时可以处理资源。 – minhee