重新定义变量后,如何关闭用fitz打开的PDF文件?
解决PyMuPDF重定义变量后原PDF文件被占用的问题
临时救急:释放所有未关闭的PDF对象
如果已经出现文件被占用的情况,不用重启Notebook,直接运行这段代码就能找到并关闭所有打开的PyMuPDF文档对象:
import gc import fitz # 遍历当前Python环境中所有存活的对象 for obj in gc.get_objects(): if isinstance(obj, fitz.Document): try: print(f"关闭文件: {obj.name}") obj.close() except Exception: # 忽略已经损坏或无法关闭的对象 pass
这段代码会把所有未关闭的fitz.Document类型对象全部关闭,不管你有没有保留它们的变量引用,原文件的占用状态会立刻释放。
提前预防:用上下文管理器避免遗忘关闭
以后处理PDF时,优先用with语句(上下文管理器),它会在代码块结束后自动关闭文件,完全不用手动调用close():
with fitz.open('dir/to/file.pdf') as pdf: # 在这里执行所有PDF操作,比如提取文本、修改页面 page_content = pdf[0].get_text() print(page_content) # 离开with代码块后,pdf会自动关闭,文件不会被占用
就算之后重新定义pdf变量,原文件已经被自动关闭,不会出现占用问题。
手动管理:追踪所有打开的PDF对象
如果习惯手动控制,可以用列表来记录所有打开的PDF对象,需要关闭时批量处理:
# 创建一个列表保存所有打开的PDF对象 active_pdfs = [] # 打开第一个文件并加入列表 pdf_a = fitz.open('dir/to/file.pdf') active_pdfs.append(pdf_a) # 处理完后关闭并移除 pdf_a.close() active_pdfs.remove(pdf_a) # 打开新文件 pdf_b = fitz.open('dir/to/other_file.pdf') active_pdfs.append(pdf_b) # 批量关闭所有打开的文件 for doc in active_pdfs: doc.close() active_pdfs.clear()
内容的提问来源于stack exchange,提问作者José Chamorro
相关产品推荐
相关产品推荐

