Python教程:定制化解析复杂空格分隔文本并生成CSV


Python教程:定制化解析复杂空格分隔文本并生成CSV

当面对格式不规范、空格分隔的文本文件时,标准的数据导入库如pandas可能无法有效处理。本教程将指导您如何利用python和正则表达式,通过定制化的解析逻辑,识别并区分字段分隔符与数据内部的空格,从而成功地将此类“脏数据”转换为结构化的csv文件。

在数据处理的实践中,我们经常会遇到格式不规范的文本文件。这类文件通常使用不规则数量的空格来分隔字段,甚至在数据字段内部也可能包含空格,这使得传统的 pandas.read_csv 等方法难以直接处理。例如,尝试使用制表符 (sep='\t') 或固定数量空格 (sep=r"\s{2,}") 作为分隔符,往往会导致列错位、数据丢失或解析错误。为了有效地将这类“坏”文本文件转换为结构化的CSV格式,我们需要编写自定义的Python解析逻辑。

理解“坏”文本文件的挑战

问题中提供的文本数据示例很好地说明了这类文件带来的挑战:

  • 不一致的空格长度: 不同字段之间分隔的空格数量不固定,这使得无法简单地通过固定宽度或统一的分隔符进行分割。
  • 数据内部的空格: 某些字段(例如 Message 字段)本身包含两个或更多连续的空格(如“Rejected at level”中的“at”和“level”之间),这极易与字段分隔符混淆,导致错误的列分割。
  • 空行: 文件中可能包含空行,需要被正确识别和忽略。
  • 缺失值: 某些字段可能为空,表现为连续的多个空格,其长度可能与字段分隔符的长度相似。

定制化解析方案: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)

代码解析与注意事项

  1. 逐行处理: 文件被逐行读取,这允许我们根据行号(例如,标题行与数据行)应用不同的解析规则。rstrip('\n') 用于移除行尾的换行符。
  2. replfunc 的核心作用: 这是整个解析逻辑的关键。re.sub(r'\s{2,}', replfunc, line) 会查找所有连续两个或更多空格的序列 (\s{2,}),并对每个匹配项调用 replfunc 函数。
  3. 区分数据内部空格与分隔符: replfunc 首先检查一个特定的模式("Rejected at level."),如果匹配,则将两个空格替换为单个空格,从而保留其作为数据的一部分。这种模式识别是针对特定业务逻辑的定制化处理,对于不同的文件,需要根据实际情况调整。
  4. 动态映射空格长度到制表符: 对于其他连续空格,replfunc 根据其长度将其替换为一个或多个制表符 (\t)。例如,如果 L 是 17,它被替换为两个制表符,这暗示了在原始文本中可能存在一个空字段。这些映射规则 (L == 17 对应 \t\t 等) 是通过观察原始数据中不同字段分隔符的宽度总结出来的,并且可能需要根据实际文件的具体情况进行微调。这是最需要人工分析和调整的部分。
  5. split('\t'): 一旦所有字段分隔符都被统一替换为制表符,就可以简单地使用 split('\t') 来获取最终的字段列表。
  6. CSV写入: 使用Python内置的 csv 模块将解析后的数据写入CSV文件。newline='' 参数在 open() 中是重要的,它能防止在Windows系统上写入额外的空行。
  7. 通用性限制: 这种方法高度依赖于对特定“坏”文件格式的观察和理解。如果文件格式稍有变化,replfunc 中的逻辑(特别是空格长度的映射)可能需要重新调整。对于高度不规则的文件,甚至可能需要更复杂的有限状态机或机器学习方法来自动识别模式。
  8. 错误处理: 示例代码中包含文件读取和写入的 try-except 块,以提高程序的健壮性。replfunc 中的 else 分支可以用于处理未预期的空格长度,这对于调试和发现新的格式模式非常有用。

总结

处理格式不规范的文本文件是一项常见的挑战,尤其当标准库无法直接胜任时。通过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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.