二进制转Python对象并合并后转回二进制出现EOFError的问题求助
问题排查与解决方案
看起来你遇到的问题主要是pickle文件写入/读取不完整,加上代码里的一些小疏漏导致的。咱们一步步来解决:
1. 修复代码中的变量名错误
你的合并代码里存在变量名不匹配的问题:
inputfile1 = open('/path/to/binary/texts1','rb') texts1 = pickle.load(infile1) # 这里用了infile1,但定义的是inputfile1!
这个错误会直接导致NameError,如果你的实际运行代码里修正了这个,那接下来的问题大概率是文件资源没有正确管理。
2. 用with语句确保文件正确关闭
手动打开文件后如果忘记关闭,或者在写入后没有刷新缓冲区,会导致pickle文件不完整,进而出现EOFError,同时文件体积远小于预期。改用with语句可以自动处理文件的打开和关闭,避免这类问题:
修正后的合并代码:
import pickle # 加载两个pickle文件 with open('/path/to/binary/texts1', 'rb') as f1, open('/path/to/binary2/texts2', 'rb') as f2: texts1 = pickle.load(f1) texts2 = pickle.load(f2) # 合并对象 texts_combined = texts1 + texts2 # 保存合并后的对象 with open('/Path/to/new/binary/newtext', 'wb') as out_f: pickle.dump(texts_combined, out_f, protocol=pickle.HIGHEST_PROTOCOL)
这里加上protocol=pickle.HIGHEST_PROTOCOL可以让pickle文件更小、写入读取更快,同时保证兼容性。
3. 验证源pickle文件的完整性
在合并之前,先单独加载两个源文件,确认它们本身没有损坏:
# 验证第一个文件 with open('/path/to/binary/texts1', 'rb') as f: test1 = pickle.load(f) print(f"第一个文件包含{len(test1)}条数据") # 验证第二个文件 with open('/path/to/binary2/texts2', 'rb') as f: test2 = pickle.load(f) print(f"第二个文件包含{len(test2)}条数据")
如果这一步出现EOFError,说明你的源文件在生成时就有问题,需要检查生成代码。
4. 优化生成pickle文件的代码
你的生成代码里,处理大体积PDF时可能因为内存占用过高或缓冲区未刷新导致文件不完整,同样改用with语句,同时增加异常处理避免单个文件失败中断流程:
import os import textract from nltk.tokenize import tokenizer # 假设你用的是nltk的tokenizer from nltk.corpus import stopwords from nltk.stem import PorterStemmer p_stemmer = PorterStemmer() my_path = "/path/to/pdfs" # 不需要额外加引号 files = os.listdir(my_path) doc_set = [] for file in files: newpath = os.path.join(my_path, file) try: newpath1 = textract.process(newpath) newpath2 = newpath1.decode(encoding='utf-8') doc_set.append(newpath2) except Exception as e: print(f"处理文件{file}时出错: {e}") texts = [] for i in doc_set: raw = i.lower() tokens = tokenizer.tokenize(raw) stopped_tokens = [i for i in tokens if i not in stopwords.words()] stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens] texts.append(stemmed_tokens) # 用with语句保存pickle文件 with open('texts1', 'wb') as outfile2: pickle.dump(texts, outfile2, protocol=pickle.HIGHEST_PROTOCOL)
为什么会出现文件体积过小和EOFError?
- 如果源文件本身不完整(生成时没正确关闭),加载时会直接抛出
EOFError,合并后的文件自然也会有问题。 - 合并时没正确关闭输出文件,缓冲区的数据没完全写入磁盘,导致文件体积偏小,后续加载时读到文件末尾就会触发
EOFError。
按照上面的步骤修正后,应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Eisenheim
相关产品推荐
相关产品推荐

