
当面对格式不规范、空格分隔的文本文件时,标准的数据导入库如pandas可能无法有效处理。本教程将指导您如何利用python和正则表达式,通过定制化的解析逻辑,识别并区分字段分隔符与数据内部的空格,从而成功地将此类“脏数据”转换为结构化的csv文件。
在数据处理的实践中,我们经常会遇到格式不规范的文本文件。这类文件通常使用不规则数量的空格来分隔字段,甚至在数据字段内部也可能包含空格,这使得传统的 pandas.read_csv 等方法难以直接处理。例如,尝试使用制表符 (sep='\t') 或固定数量空格 (sep=r"\s{2,}") 作为分隔符,往往会导致列错位、数据丢失或解析错误。为了有效地将这类“坏”文本文件转换为结构化的CSV格式,我们需要编写自定义的Python解析逻辑。
问题中提供的文本数据示例很好地说明了这类文件带来的挑战:
针对这类复杂场景,最有效的方法是采用逐行读取文件,并结合正则表达式进行精细化匹配和替换的策略。核心思想是:识别不同长度的连续空格所代表的含义——究竟是字段分隔符,还是数据本身的一部分。
芝士饼
芝士饼是一个一站式AI原生应用开发平台,简单几步即可完成应用的创建与发布。
84
查看详情
以下是实现这一目标的核心Python代码,并附带详细解释:
import re
import csv
def parse_bad_txt_to_table(filepath):
"""
解析不规范的空格分隔文本文件,并将其转换为一个列表的列表(表格形式)。
Args:
filepath (str): 待解析的文本文件路径。
Returns:
list[list[str]]: 解析后的数据表格,每个内部列表代表一行。
"""
table = []
try:
with open(filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
except FileNotFoundError:
print(f"错误:文件 '{filepath}' 未找到。")
return []
except Exception as e:
print(f"读取文件时发生错误:{e}")
return []
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: # 2到12个空格,替换为单个制表符
return '\t'
elif L == 17: # 17个空格,替换为两个制表符(表示中间可能存在一个空字段)
return '\t\t'
elif L == 43: # 43个空格,替换为三个制表符
return '\t\t\t'
elif L == 61: # 61个空格,替换为五个制表符
return '\t\t\t\t\t'
elif L == 120 or L == 263: # 其他特定长度的空格,替换为单个制表符
return '\t'
else:
# 如果遇到未预料的空格长度,可以标记出来以便调试和规则完善。
# print(f"警告: 未处理的空格长度 {L} 在行 {i+1}: '{line}'")
return '\t' # 默认替换为单个制表符,可能需要调整
# 使用re.sub结合replfunc替换连续空格,将字段分隔符统一为制表符
tabbed_line = re.sub(r'\s{2,}', replfunc, line)
row = tabbed_line.split('\t') # 依据制表符分割字段
table.append(row)
return table
def write_table_to_csv(table_data, output_filepath):
"""
将解析后的表格数据写入CSV文件。
Args:
table_data (list[list[str]]): 待写入的表格数据。
output_filepath (str): 输出CSV文件的路径。
"""
try:
with open(output_filepath, 'w', newline='', encoding='utf-8') as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerows(table_data)
print(f"数据已成功转换为 '{output_filepath}'")
except Exception as e:
print(f"写入CSV文件时发生错误:{e}")
# --- 示例使用 ---
input_file = 'input.txt' # 假设您的原始文本文件名为input.txt
output_file = 'Report.csv'
# 1. 解析文本文件
parsed_data_table = parse_bad_txt_to_table(input_file)
# 2. 将解析后的数据写入CSV文件
if parsed_data_table:
write_table_to_csv(parsed_data_table, output_file)
# ---------------------------
# 以下代码用于在控制台美观地打印解析结果,便于检查(可选)
def print_formatted_table(table_data):
"""
在控制台以对齐的方式打印表格数据。
"""
if not table_data:
print("无数据可显示。")
return
# 计算每列的最大宽度
max_n_fields = max(len(row) for row in table_data)
field_widths = [0] * max_n_fields
for row in table_data:
for j, field in enumerate(row):
if j < max_n_fields:
field_widths[j] = max(field_widths[j], len(field))
# 打印表格
for row in table_data:
for j, field in enumerate(row):
if j < max_n_fields:
print(field.ljust(field_widths[j]), end='|')
print()
# print("\n解析结果预览:")
# print_formatted_table(parsed_data_table)处理格式不规范的文本文件是一项常见的挑战,尤其当标准库无法直接胜任时。通过Python结合正则表达式的定制化解析,我们可以精确控制如何识别和处理字段分隔符,即使在数据内部存在与分隔符相似的模式。虽然这种方法需要根据具体文件格式进行细致的调整和测试,但它为解决复杂的数据清洗问题提供了一个强大而灵活的工具。在实际应用中,建议对数据进行充分的探索性分析,以建立准确的解析规则,并考虑将解析逻辑模块化,以便于维护和复用。
以上就是Python教程:定制化解析复杂空格分隔文本并生成CSV的详细内容,更多请关注其它相关文章!
# 多个
# 网站建设及维护培训
# 沈阳数据网站建设包括
# 青岛seo排名哪个专业
# 网站建设教程 下载
# 济源百度seo关键词排名优化
# 西秀网站建设报价
# 章丘网站建设价格优惠
# 国外seo在线瑟瑟
# 抖音关键词排名推广团队联系方式
# 闵行营销推广平台官网入口
# 浮点
# 这是
# 不规范
# 芝士
# python
# 转换为
# 这类
# 文本文件
# 分隔符
# 数据丢
# csv文件
# windows系统
# 数据清洗
# win
# csv
# 工具
# app
# windows
# 正则表达式
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
微信客户端如何找回密码_微信客户端忘记密码找回方法
J*aScript实现网页表单实时输入字段比较与验证教程
铁路12306入口 铁路12306官网版入口登录网址
Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频
PySimpleGUI中实现键盘按键与按钮事件绑定教程
c++如何使用std::thread::join和detach_c++线程生命周期管理
WPS文字如何进行简繁转换
PDF文件去水印平台入口 PDF水印删除网址
CSS如何控制元素外边距_margin实现布局间隔
Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制
《偃武》甘宁技能详解
安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法
圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪
餐馆菜篮选购指南
管理打开的编辑器:固定、分组和关闭技巧
江苏大剧院会员卡购买步骤
C++ bind函数使用教程_C++参数绑定与函数适配器的应用
顺丰官方查单号入口 顺丰快递单号查询官网入口
快手极速版在线体验区 快手极速版网页体验入口
手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】
淘口令快速解析技巧
哈尔滨城市通昵称修改方法
如何在mysql中比较InnoDB和MyISAM区别
Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南
悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口
智学网成绩单查询系统网_智学网学生平台登录
在VS Code中进行数据科学和机器学习开发
J*aScript模拟悬停与点击:自动化网页动态元素交互指南
C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用
AO3官方镜像链接 | 最新防走失网址永久收藏
豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】
TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法
蜻蜓FM如何设置移动流量播放
Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理
解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用
TikTok网页版入口快速访问 TikTok官网账号登录方法
动漫之家观看全集库 动漫之家免费资源网地址
快递查询,一键速查
《360浏览器》设置摄像头权限方法
Dash应用多值文本输入处理与类型转换教程
Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析
汽水音乐网页端访问 汽水音乐官方网页直达
Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式
Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】
C++ static关键字作用_C++静态成员变量与静态函数
泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口
使用Google服务账号实现Google Drive API无缝集成与文件访问
C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用
2025-10-31
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。