
本文介绍如何将每三行一组的纯文本文件(如ocr识别结果)直接转换为结构化csv文件,避免手动编辑,并提供可集成到python ocr流程中的完整代码方案。
在处理OCR输出(如tesseract识别的地址信息)时,常见模式是:每条记录占据连续三行(姓名、地址、城市州邮编),但原始文本以换行分隔,缺乏行内结构。理想目标是将每三行合并为CSV中的一行,字段间用逗号分隔,最终生成标准CSV文件供后续分析或导入使用。
以下是一个健壮、可复用的解决方案,分为两个典型场景:
✅ 场景一:从已有文本文件(如 address.txt)生成 CSV
假设输入文件 address.txt 内容如下(末尾带多余逗号,需清理):
First Name, Address, City State Zip, Second Name, Second Address, Second City State zip,
使用标准库即可完成清洗、分组与导出:
import csv
# 1. 读取并清洗:去空行、去换行符、移除所有逗号(避免干扰CSV结构)
with open("address.txt", encoding="utf-8") as f:
lines = [line.strip().replace(",", "") for line in f if line.strip()]
# 2. 验证数据完整性:必须为3的倍数,否则逻辑错位
if len(lines) % 3 != 0:
raise ValueError(f"输入行数 {len(lines)} 不是3的倍数,无法按三行一组分组")
# 3. 按每3行切片,构建CSV行列表
rows = [lines[i:i+3] for i in range(0, len(lines), 3)]
# 4. 写入CSV(注意:newline='' 防止Windows下空行)
with open("address.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(rows)执行后生成 address.csv:
First Name,Address,City State Zip Second Name,Second Address,Second City State zip
✅ 场景二:在OCR流程中直接生成CSV(推荐——免中间文件)
将清洗与分组逻辑嵌入原 tess_address() 函数,跳过生成 address.txt 的步骤,提升效率与可靠性:
import os
import re
import csv
import pytesseract
def tess_address():
files = sorted(os.listdir("address"))
all_lines = []
for image in files:
output_path = os.path.join("address", image)
text = pytesseract.image_to_string(output_path)
# 清洗:移除所有逗号 + 拆行 + 去空行
lines = [re.sub(r",", "", line.strip()) for line in text.splitlines() if line.strip()]
all_lines.extend(lines)
# 验证总行数是否满足三元组要求
if len(all_lines) % 3 != 0:
print(f"警告:共 {len(all_lines)} 行,非3的倍数,将截断末尾不完整组")
all_lines = all_lines[: (len(all_lines) // 3) * 3] # 安全截断
# 构建CSV行并写入
rows = [all_lines[i:i+3] for i in range(0, len(all_lines), 3)]
with open("address.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(rows)
print(f"✅ 已成功生成 address.csv,共 {len(rows)} 条记录")⚠️ 注意事项
- 编码统一:始终显式指定 encoding="utf-8",避免中文等字符乱码;
- 逗号处理:replace(",", "") 是为消除OCR误加的冗余逗号;若原始文本中字段本身含逗号(如 "New York, NY"),应改用正则精准替换行尾逗号(rstrip(",\n\r"))或改用 csv.writer 自动转义(需保留原始逗号);
- 异常防护:添加 assert 或 if 校验确保数据规整性,避免静默错误;
- 性能优化:对大文件,可用生成器逐块读取(for line in f:),但本例中OCR输出量通常较小,列表处理更清晰。
通过以上方法,你不仅能彻底摆脱手动编辑文本文件的繁琐步骤,还能将数据预处理无缝融入自动化OCR流水线,输出即用、结构清晰的CSV文件。










