
本文介绍如何将每三行一组的纯文本文件(如 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 数据。