
在数据处理领域,我们经常会遇到格式不规范的文本文件,这些文件因其不一致的分隔符而被称为“坏”文本文件。尤其当分隔符是空格时,问题会更加复杂:字段之间可能存在不同数量的空格,甚至字段内部也可能包含看似分隔符的空格。在这种情况下,诸如pandas read_csv等标准库函数往往难以直接处理,因为它无法准确区分真正的字段边界和字段内的内容。本教程将指导您如何使用python和正则表达式来处理这类挑战性的文本文件,并将其转换为规范的csv格式。
一个典型的“坏”文本文件可能具有以下特点:
对于这类文件,尝试使用pd.read_csv并指定sep='\t'或sep=r'\s{2,}'通常会失败,因为这些方法无法处理上述的复杂性和歧义性。
import pandas as pd
# 尝试使用制表符分隔,对于空格分隔的文件无效
# df = pd.read_csv('file1.txt', sep='\t', index_col=False, dtype='object')
# 尝试使用2个或更多空格作为分隔符,但可能无法区分字段内空格
# df = pd.read_csv("file1.txt", sep=r"\s{2,}", engine="python")
# 这些方法对于不规范文件通常无法得到预期结果处理这种“坏”文本文件的最有效方法是编写一个自定义的解析器,逐行读取文件,并利用正则表达式进行精确的模式匹配和替换。核心思想是:
芝士饼
芝士饼是一个一站式AI原生应用开发平台,简单几步即可完成应用的创建与发布。
84
查看详情
下面是一个具体的Python实现示例:
import re
import csv
import sys
def parse_bad_txt_to_csv(input_filepath, output_filepath):
"""
解析不规范的空格分隔文本文件,并将其转换为CSV格式。
Args:
input_filepath (str): 输入的不规范文本文件路径。
output_filepath (str): 输出的CSV文件路径。
"""
table = []
with open(input_filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
for i, line in enumerate(lines):
line = line.rstrip('\n') # 移除行尾换行符
if i == 0:
# 第一行通常是标题行,可以假设字段间没有内部空格
# 简单地按2个或更多空格分割
row = re.split(r' {2,}', line)
table.append(row)
continue
if not line.strip(): # 检查是否是空行
# 忽略空行
continue
# 对于数据行,需要更复杂的逻辑来处理空格
def replfunc(match_obj):
"""
自定义替换函数,用于区分字段分隔符和字段内部空格。
根据匹配到的空格长度及其上下文决定如何替换。
"""
L = len(match_obj.group(0)) # 匹配到的连续空格的长度
# 特殊情况处理:例如,某些字段值内部的“Rejected at level.”
# 这里的2个空格是字段内容的一部分,而非分隔符
start, end = match_obj.span()
if L == 2 and line[:start].endswith('Rejected at') and line[end:].startswith('level.'):
return ' ' # 替换为单个空格,保持为字段内容
# 其他情况:根据空格长度判断为字段分隔符,替换为制表符
# 这些长度是根据具体数据文件观察得出的,需要根据实际文件调整
if L < 2:
# 理论上不会出现,因为我们匹配的是2个或更多空格
return match_obj.group(0)
elif 2 <= L <= 12:
return '\t' # 2到12个空格视为一个字段分隔符
elif L == 17:
return '\t\t' # 17个空格视为两个字段分隔符(如果字段是空的)
elif L == 43:
return '\t\t\t' # 43个空格视为三个字段分隔符
elif L == 61:
return '\t\t\t\t\t' # 61个空格视为五个字段分隔符
elif L == 120 or L == 263:
return '\t' # 特殊长度的空格,视为一个字段分隔符
else:
# 如果遇到未预期的空格长度,可以打印警告或返回原始匹配
sys.stderr.write(f"Warning: Unexpected space length {L} at line {i+1}\n")
return f'<{L}>' # 用特殊标记包裹,方便后续检查
# 使用replfunc替换所有连续2个或更多空格
tabbed_line = re.sub(r'\s{2,}', replfunc, line)
# 按照制表符分割行,得到字段列表
row = tabbed_line.split('\t')
table.append(row)
# 将处理后的数据写入CSV文件
with open(output_filepath, 'w', newline='', encoding='utf-8') as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerows(table)
print(f"文件已成功转换为CSV:{output_filepath}")
# 示例用法
if __name__ == "__main__":
# 创建一个模拟的“坏”文本文件
sample_data = """HP TRA ID CL ID IN/EId No Loop Element Name Freq STATUS Error Severity Error ID Message Report Source
13ZI 20712800032 1 Denied Error HP_DOSOlderTh Date of service is older than 12 months HP
13ZI 20712800032 1 1 Rejected Error CA16 Rejected at level. DupKeyID:0 is a Rejected of DupKeyID:0 from EncounterID:15C7XE9GV00 Claim ID:P_20712800032ALPHA_1649845496_19961109508100_716. HP
13ZI 20712800032 2 1 Rejected Error CA16 Rejected at level. DupKeyID:1 is a Rejected of DupKeyID:1 from EncounterID:15C7XE9GV00 Claim ID:P_20712800032ALPHA_1649845496_19961109508100_716. HP
13ZI 20712800032 3 1 Rejected Error CA16 Rejected at level. DupKeyID:2 is a Rejected of DupKeyID:2 from EncounterID:15C7XE9GV00 Claim ID:P_20712800032ALPHA_1649845496_19961109508100_716. HP
1P8TY0J25 20712805263 1 Denied Error HP_DOSOlderTh Date of service is older than 12 months
"""
with open('input.txt', 'w', encoding='utf-8') as f:
f.write(sample_data)
parse_bad_txt_to_csv('input.txt', 'output.csv')
# 验证输出 (可选)
# df_output = pd.read_csv('output.csv')
# print(df_output.head())处理不规范的文本文件并将其转换为CSV是一项常见的挑战。虽然标准库函数在大多数情况下表现良好,但面对具有复杂、模糊分隔符的“坏”文件时,自定义解析器是必不可少的。通过结合Python的字符串处理能力和正则表达式的强大模式匹配功能,我们可以创建出灵活且精确的解决方案,即使是最棘手的数据格式也能迎刃而解。关键在于对数据模式的深入理解和re.sub配合自定义替换函数的巧妙运用。请记住,此方法的成功高度依赖于您对特定输入文件结构的分析和适应。
以上就是Python处理非标准分隔符文本文件转换为CSV的实战指南的详细内容,更多请关注其它相关文章!
# 正则表达式
# 无锡网站建设有几种公司
# 线上运营营销推广的书籍
# 免费送seo的软件
# 天津数据网站建设公司
# 宁波关键词排名效果
# 网络销售seo
# 邛崃网站优化哪个好用啊
# 非标准
# 浮点
# 是一个
# 芝士
# 不规范
# 自定义
# 转换为
# 文本文件
# 分隔符
# 标准库
# csv文件
# ai
# csv
# app
# python
# 深圳抖音推广营销号
# 旅游地营销推广策略
# seo精品分享
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
c++类和对象到底是什么_c++面向对象编程基础
解决jQuery多计算器输入字段冲突的教程
《伊瑟》凶影追缉库卢鲁boss攻略
教育查询官方网站入口 教育个人档案查询免费官网
苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤
PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略
在VS Code中利用AI辅助进行代码迁移
《小宇宙》标记不友善评论方法
如何在Golang中处理表单文件上传_Golang 表单文件上传示例
如何通过settings.json个性化您的VS Code体验
冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤
Apple Music无故扣费引质疑
猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程
京东物流快递破损了怎么办_京东快递破损理赔流程
动漫岛汉化官网网 动漫岛官方动漫汉化地址
猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程
铁路12306官网登录入口 铁路12306在线购票官方平台
火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】
顺丰快递怎么查物流_顺丰快递物流信息实时查询操作指南
快递物流路径揭秘
智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法
c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化
解决SQLAlchemy模型跨文件关联的Linter兼容性指南
《海豚家》注销账号方法
优化Leaflet弹出层图片显示:条件渲染策略
《书耽》更换手机号方法
电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】
WooCommerce 新客户订单自动添加管理员备注教程
使用VS Code调试Python代码:从入门到精通
sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧
电脑视频号|直播|如何分享屏幕
163邮箱网页版入口 163邮箱在线使用
word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法
J*aScript桌面应用_Electron多进程架构实战
windows10怎么设置电源按钮_windows10按下电源键功能修改
嘀嗒顺风车如何开具电子发票
在Dash应用中自定义HTML标题和网站图标
有道AI翻译入口 智能写作官方网站入口
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
《红果免费短剧》下载观看方法
《东方财富》条件单关闭方法
微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程
Animex动漫社社登录官网 Animex动漫社资源社入口直达
优化Flask模板中SQLAlchemy查询迭代标签:处理字符串空格问题
PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略
口腔诊所管理软件推荐
稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口
VS Code中的Tailwind CSS IntelliSense插件使用技巧
芒果TV官网登录入口 芒果TV官方网站登录入口
j*a中ArrayBlockingQueue的使用
2025-11-01
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。