Python多文档处理时出现Expected string or buffer错误的技术问询
解决多文档处理时的"expected string or buffer"错误
看起来你在批量处理文档时遇到了正则匹配的类型错误,这个问题通常是因为re.split()接收到了非字符串类型的输入,或者拆分后的列表里混入了无效元素。咱们一步步来分析和解决:
错误原因分析
你的单文档代码能正常工作,但多文档场景下出错,大概率是这几个情况:
- 某个目标文档为空,或者读取时出现异常导致
data不是字符串类型 re.split(r"\n(\s)*\n", data)的拆分结果里混入了空字符串或非字符串元素,后续循环处理时传递给re.split()引发报错- 批量处理时的文件遍历逻辑有问题,误将非文件对象或无效内容传入了处理流程
修复步骤和代码示例
1. 优化单文档处理逻辑,增加容错性
先把单文件处理的逻辑加固,确保每个环节都处理字符串类型的输入,并过滤无效元素:
import re import io from pathlib import Path def process_single_file(input_path, write_path): try: # 指定编码避免乱码,同时兼容不同系统的文件 with io.open(input_path, mode='r', encoding='utf-8') as f, io.open(write_path, mode='w', encoding='utf-8') as f2: data = f.read() # 确保data是字符串,处理空文档或读取异常的情况 if not isinstance(data, str): data = str(data) # 优化正则:匹配任意空行(包括中间带空白字符的空行),避免捕获组产生多余元素 # 拆分后过滤掉全空白的段落 para_list = [para.strip() for para in re.split(r'\n\s*\n', data) if para.strip()] processed_lines = [] for para in para_list: # 拆分段落为行,同样过滤全空白的行 lines = [line.strip() for line in re.split(r'\n', para) if line.strip()] processed_lines.extend(lines) # 将处理后的内容写入输出文件 f2.write('\n'.join(processed_lines)) except Exception as e: print(f"处理文件 {input_path} 时出错: {str(e)}")
2. 批量处理多文档的完整流程
基于上面的单文件处理函数,实现批量遍历目录下的文档:
# 配置输入输出目录 input_dir = Path("./your_input_folder") output_dir = Path("./your_output_folder") # 自动创建输出目录(如果不存在) output_dir.mkdir(exist_ok=True) # 遍历目录下的所有文本文件(可根据需要修改后缀,比如*.md、*.txt) for input_file in input_dir.glob("*.txt"): # 保持输出文件和输入文件同名 output_file = output_dir / input_file.name process_single_file(input_file, output_file) print("多文档处理完成!")
3. 关键优化点
- 正则表达式优化:把
r"\n(\s)*\n"改成r"\n\s*\n",去掉不必要的捕获组,避免拆分后产生多余的空字符串元素 - 过滤无效内容:在拆分段落和行之后,都通过
strip()和条件判断过滤掉全空白的元素,避免后续处理出错 - 异常处理:添加
try-except块,单个文件处理出错时不会中断整个批量任务,还能打印错误信息方便排查 - 编码指定:打开文件时明确指定
encoding='utf-8',避免不同编码的文档读取时出现乱码或异常
4. 快速排查问题文件
如果还是报错,可以在process_single_file函数里添加调试打印,定位出问题的文件:
print(f"正在处理: {input_path}") print(f"读取到的内容类型: {type(data)}, 内容长度: {len(data)}")
内容的提问来源于stack exchange,提问作者Subigya Upadhyay
相关产品推荐
相关产品推荐

