Traceback (most recent call last): File "D:\Python\程序练习\修改后的程序\字符串2.py", line 47, in <module> txt_file.write('=== PDF文件头信息 ===\n') ValueError: I/O operation on closed file.
时间: 2023-12-02 11:02:29 浏览: 132
这个错误提示说明你在对一个已经关闭的文件对象进行操作。在你的代码中,你使用了两个 with 语句来打开文件对象 txt_file 和 pdf_file,这两个 with 语句分别在代码的不同位置。在第一个 with 语句结束后,txt_file 文件对象已经被关闭了,如果你在第二个 with 语句中还想操作这个对象,就会出现 I/O operation on closed file 的错误。
解决这个问题的方法是将两个 with 语句合并为一个,这样就不会出现文件对象被关闭的情况了。你可以这样修改代码:
```python
import PyPDF2
import sys
import io
# 创建一个文本输出流,包装标准输出
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# 创建一个txt文件并打开文件对象
with open('output1.txt', 'w', encoding='utf-8') as txt_file:
# 打印包含特殊字符的字符串
s = 'PDF文件头信息:\xae'
txt_file.write(s + '\n')
# 打开PDF文件
with open('x1/hunan28.pdf', 'rb') as pdf_file:
# 创建一个PDF读取器对象
pdf_reader = PyPDF2.PdfFileReader(pdf_file)
# 打印PDF文件头信息
txt_file.write('=== PDF文件头信息 ===\n')
pdf_info = pdf_reader.getDocumentInfo()
for key, value in pdf_info.items():
try:
txt_file.write(f'{key}: {value}\n')
except UnicodeEncodeError:
txt_file.write(f'{key}: {" ".join(value.split())}\n')
# 打印PDF文件体信息
txt_file.write('=== PDF文件体信息 ===\n')
for page_num in range(pdf_reader.getNumPages()):
page = pdf_reader.getPage(page_num)
page_content = page.extractText().encode('utf-8')
txt_file.write(f'第{page_num+1}页的内容:\n{page_content}\n')
# 打印PDF交叉引用表信息
txt_file.write('=== PDF交叉引用表信息 ===\n')
txt_file.write(str(pdf_reader.xref) + '\n')
# 打印PDF文件尾信息
txt_file.write('=== PDF文件尾信息 ===\n')
txt_file.write(str(pdf_reader.trailer) + '\n')
```
这样修改后,两个文件对象都在同一个 with 语句中,不会出现被关闭的情况了。
阅读全文