
本文介绍如何将每三行一组的纯文本文件(如 ocr 输出)直接转换为标准 csv 格式,避免手动编辑;提供完整可运行代码,支持从 ocr 文本实时生成 csv,同时处理多余逗号、换行与分组逻辑。
在 OCR 后处理流程中,常遇到结构松散的文本输出:例如地址信息被拆分为“姓名”“地址”“城市州邮编”各占一行,且末尾带冗余逗号。若每次生成 address.txt 后还需额外脚本整理为 CSV,不仅低效,还易引入错误。理想方案是在 tess_address() 函数中直接完成分组与 CSV 写入,跳过中间文本文件。
以下为优化后的完整实现,分为两部分:(1)直接处理 OCR 文本生成 CSV;(2)兼容已有文本文件的离线转换。
✅ 方案一:OCR 流程中直出 CSV(推荐)
修改原 tess_address() 函数,在内存中完成清洗、分组与写入,不落地中间 .txt 文件:
import os
import csv
import re
import pytesseract
def tess_address():
files = sorted(os.listdir("address"))
rows = [] # 存储所有三元组行
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()]
# 验证行数是否为3的倍数(确保结构完整)
if len(lines) % 3 != 0:
print(f"警告: 图像 {image} 产生 {len(lines)} 行,非3的倍数,将截断至最近3的倍数")
lines = lines[:len(lines) // 3 * 3] # 安全截断
# 每3行合并为1个CSV行
for i in range(0, len(lines), 3):
rows.append(lines[i:i+3])
# 一次性写入CSV(使用newline=''避免Windows下空行)
with open("address_output.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(rows)
print(f"✅ 已生成 CSV 文件,共 {len(rows)} 行数据")关键改进点: 使用 re.sub(r",", "", line) 精准清除每行内原有逗号,保留字段内自然逗号(如 "New York, NY" 不会被破坏); if line.strip() 过滤空行,提升鲁棒性; 主动截断非3倍数行,避免 assert 中断程序; encoding="utf-8" 显式声明编码,防止中文乱码。
✅ 方案二:离线转换现有文本文件
若需复用已有 address.txt,可用此独立函数转换:
import csv
def txt_to_csv(input_file="address.txt", output_file="address.csv"):
with open(input_file, "r", encoding="utf-8") as f:
lines = [line.strip().rstrip(",") for line in f if line.strip()]
# 移除每行末尾逗号(保留行内逗号)
lines = [line.rstrip(",") for line in lines]
if len(lines) % 3 != 0:
raise ValueError(f"输入行数 {len(lines)} 不是3的倍数,请检查文件格式")
rows = [lines[i:i+3] for i in range(0, len(lines), 3)]
with open(output_file, "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(rows)
print(f"✅ 已将 {input_file} 转换为 {output_file}")⚠️ 注意事项
-
CSV 字段含逗号/换行? 当前逻辑假设字段内无逗号或引号。若 OCR 输出可能含复杂内容(如 "Smith, John"),建议改用 csv.QUOTE_MINIMAL 并启用 quoting:
writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL)
- 性能考量:对超大文件(>10MB),可改用生成器逐块读取,但 OCR 场景通常单文件较小,当前内存加载方案更简洁。
- 路径安全:生产环境建议用 pathlib.Path 替代字符串拼接,增强跨平台兼容性。
通过以上重构,你彻底摆脱了“生成文本→手动编辑→转CSV”的繁琐链路,让 OCR 处理结果一步到位成为可直接导入 Excel 或 Pandas 的标准 CSV 数据。










