Python实战:高效处理不规范文本文件并转换为CSV

Python实战:高效处理不规范文本文件并转换为CSV

本教程详细阐述了如何使用python正则表达式处理结构不规则、空格分隔的文本文件,并将其转换为规范的csv格式。针对传统解析方法失效的“坏”文本文件,文章提供了一种自定义解析策略,通过智能识别和替换空格序列为制表符,有效解决字段边界模糊和字段内空格干扰的问题,确保数据准确提取。

引言:不规范文本文件的挑战

在数据处理中,我们经常会遇到格式不规范的文本文件,尤其是一些遗留系统或人工生成的报告。这类文件通常使用空格作为字段分隔符,但其“不规范”之处在于:

不一致的空格数量:不同字段之间的空格数量可能不固定。字段内包含空格:某些字段本身的值中可能包含空格,这些空格可能被误识别为分隔符。空字段表示:空字段可能通过多个连续空格来表示,其长度与其他字段分隔符的空格长度相似,难以区分。

当遇到此类“坏”文本文件时,诸如pandas.read_csv等标准库函数,即使尝试使用sep=’t’或sep=r’s{2,}’等参数,也往往难以准确解析,导致数据错位或合并。这要求我们采用更灵活、更具上下文感知能力的自定义解析方法。

自定义解析策略:Python与正则表达式

解决这类问题的核心在于利用Python的正则表达式(re模块)进行精细化匹配和替换。我们的目标是将不规则的空格序列转换为统一的制表符(t),从而可以使用制表符作为可靠的分隔符来拆分字段。

1. 文件读取与初步处理

首先,我们需要逐行读取文本文件,并对每行进行基本的清理,例如移除行尾的换行符。

立即学习“Python免费学习笔记(深入)”;

import reimport pandas as pdimport csv # 也可以使用 csv 模块进行输出def parse_bad_txt_to_table(filepath):    table = []    with open(filepath, 'r', encoding='utf-8') as f:        lines = f.readlines()    for i, line in enumerate(lines):        line = line.rstrip('n') # 移除行尾换行符        # ... 后续解析逻辑

2. 头部行解析

通常,文件的第一行是标题行(Header)。标题行中的字段名通常不会包含内部空格,因此我们可以相对简单地通过两个或更多空格来拆分它。

小绿鲸英文文献阅读器 小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

小绿鲸英文文献阅读器 199 查看详情 小绿鲸英文文献阅读器

        if i == 0:            # 标题行:通过两个或更多空格进行拆分            row = re.split(r' {2,}', line)            table.append(row)            continue

3. 处理空白行

在某些不规范文件中,标题行和数据行之间可能存在一个或多个空白行。我们需要跳过这些空白行,以避免它们干扰数据解析。

        if i == 1: # 假设第二行是空白行            if line.strip() != '': # 增加一个检查,确保确实是空白行                print(f"Warning: Expected blank line at index 1, found: '{line}'")            continue

4. 数据行解析的核心:智能替换函数

数据行的解析是整个过程最复杂的部分,因为我们需要区分字段分隔符和字段内部的空格。这里我们使用re.sub()函数结合一个自定义的替换函数(replfunc)来实现。replfunc会根据匹配到的空格序列的长度及其上下文来决定如何替换。

        # 数据行解析        def replfunc(mo):            L = len(mo.group(0)) # 匹配到的空格序列的长度            start, end = mo.span() # 匹配到的空格序列在原始行中的起始和结束位置            # 特殊情况处理:字段内部的空格            # 示例中发现 "Rejected at  level." 这种模式,两个空格是字段值的一部分            if L == 2 and line[:start].endswith('Rejected at') and line[end:].startswith('level.'):                return ' ' # 替换为单个空格,而不是分隔符            # 其他情况,根据空格序列长度判断为字段分隔符            # 这里的逻辑高度依赖于具体数据文件的空格模式,需要根据实际情况调整            if L < 2:                # 理论上,如果正则表达式是 r's{2,}',不应该匹配到少于2个空格                return mo.group(0) # 保留原始匹配,或抛出错误            elif 2 <= L <= 12:                return 't' # 替换为单个制表符            elif L == 17:                return 'tt' # 替换为两个制表符,表示中间有一个空字段            elif L == 43:                return 'ttt' # 替换为三个制表符            elif L == 61:                return 'ttttt' # 替换为五个制表符            elif L == 120 or L == 263:                return 't' # 替换为单个制表符            else:                # 捕获未处理的空格序列长度,方便调试和后续调整                print(f"Warning: Unhandled space run length {L} at line {i+1}: '{line}'")                return 't' # 默认替换为单个制表符        tabbed_line = re.sub(r's{2,}', replfunc, line) # 使用 replfunc 替换所有两个或更多空格的序列        row = tabbed_line.split('t') # 最终通过制表符拆分字段        table.append(row)    return table

replfunc的关键点:

它接收一个匹配对象mo,通过mo.group(0)获取匹配到的字符串(即连续的空格)。L是空格序列的长度。通过line[:start]和line[end:]检查匹配位置前后的文本,实现上下文感知。这是识别字段内空格的关键。对于被识别为字段分隔符的空格序列,根据其长度替换为不同数量的制表符。例如,如果一个长空格序列实际上代表了两个空字段,则替换为tt。这使得即使原始数据中没有显式的分隔符,也能正确生成空字段。

5. 构建数据表格

经过上述处理,每行数据都被转换成了一个字段列表。我们将这些列表存储在一个更大的列表(table)中,形成一个二维数据结构。

完整代码示例

将上述逻辑整合,形成一个完整的Python函数:

import reimport pandas as pddef parse_bad_txt_to_table(filepath):    """    解析不规范的空格分隔文本文件,并返回一个二维列表(表格)。    """    table = []    try:        with open(filepath, 'r', encoding='utf-8') as f:            lines = f.readlines()    except FileNotFoundError:        print(f"Error: File not found at {filepath}")        return []    except Exception as e:        print(f"Error reading file {filepath}: {e}")        return []    for i, line in enumerate(lines):        line = line.rstrip('n') # 移除行尾换行符        if i == 0:            # 标题行:通过两个或更多空格进行拆分            row = re.split(r' {2,}', line)            table.append(row)            continue        if i == 1:            # 假设第二行是空白行,跳过            if line.strip() != '':                print(f"Warning: Expected blank line at index 1, found: '{line}'")            continue        # 数据行解析        def replfunc(mo):            L = len(mo.group(0)) # 匹配到的空格序列的长度            start, end = mo.span() # 匹配到的空格序列在原始行中的起始和结束位置            # 特殊情况处理:字段内部的空格,例如 "Rejected at  level."            if L == 2 and line[:start].endswith('Rejected at') and line[end:].startswith('level.'):                return ' ' # 替换为单个空格,作为字段值的一部分            # 否则,根据空格序列长度判断为字段分隔符            if L < 2:                # 如果 r's{2,}' 匹配到少于2个空格,这表示正则表达式可能需要调整                return mo.group(0)             elif 2 <= L <= 12:                return 't'            elif L == 17:                return 'tt'            elif L == 43:                return 'ttt'            elif L == 61:                return 'ttttt'            elif L == 120 or L == 263:                return 't'            else:                # 捕获并警告未处理的空格序列长度,有助于调试                print(f"Warning: Unhandled space run length {L} at line {i+1}: '{line}'")                return 't' # 默认替换为单个制表符        tabbed_line = re.sub(r's{2,}', replfunc, line)        row = tabbed_line.split('t')        table.append(row)    return table# --- 示例用法 ---# 假设 'input.txt'

以上就是Python实战:高效处理不规范文本文件并转换为CSV的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/577956.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小米怎么画圣诞树
上一篇 2025年11月10日 09:24:15
Swoole如何实现一个简单的RPC服务
下一篇 2025年11月10日 09:24:28

相关推荐

  • VS Code微服务开发:Docker与Kubernetes集成

    VS Code通过Docker扩展实现本地容器化开发,支持自动生成Dockerfile、一键构建镜像及devcontainer环境一致性;2. Kubernetes扩展可连接集群并管理资源,结合Bridge to Kubernetes实现本地调试与集群网络集成;3. 使用Skaffold自动化构建部…

    2026年9月24日
    000
  • 使用正则表达式从JSON数组中提取JSON对象

    本文旨在提供一种使用Java正则表达式从包含多个JSON对象的JSON数组中提取单个JSON对象的方法。我们将详细介绍如何构建合适的正则表达式,并提供示例代码演示如何在Java中使用该表达式来实现JSON对象的提取,并对提取后的字符串进行优化处理,移除不必要的空白字符。 从JSON数组中提取JSON…

    2026年9月24日
    000
  • mac怎么使用听写功能_mac听写输入开启方法

    首先启用高级听写功能,进入系统设置→键盘→听写,勾选“使用高级听写”并下载语言包;随后可设置快捷键(如双击Fn键)快速启动语音输入;在支持的应用中也可通过菜单栏“编辑→开始听写”直接调用;最后根据需要配置听写语言、自动纠正及连续听写选项以提升识别准确率。 如果您希望在Mac上通过语音输入文字以提高效…

    2026年9月24日
    200
  • Intel OpenCAS缓存加速方案

    open cas 架构概览:数据从hdd盘读取后被复制到open cas的缓存中,后续的读取操作从内存中进行,从而提高读写效率。在write-through模式下,所有数据同步刷新到open cas的ssd和后端的hdd中。在write-back模式下,数据同步写入到open cas的ssd中,然后…

    2026年9月24日
    400
  • Java中固定长度用户ID输入验证:解决int类型长度检查问题

    本文详细介绍了在Java程序中如何实现用户输入固定长度ID的验证机制。针对常见的int cannot be dereferenced错误,我们将探讨将ID作为字符串读取并进行长度及格式校验的最佳实践,并提供处理字母数字型和纯数字型ID的示例代码,确保数据输入的准确性和程序的健壮性。 引言:用户输入验…

    2026年9月24日
    500
  • 数据实时迁移同步工具 CloudCanal v5.2.0.0 发布,支持 SaaS 全托管

    cloudcanal 免费社区版 是 clougence 公司推出的一款全自研、可视化、自动化数据迁移同步工具,具备 结构迁移、数据迁移、数据同步、数据校验、数据订正 等功能,支持 60+ 款流行关系型数据库、实时数仓、消息中间件、缓存数据库和搜索引擎之间数据互通,其中包含国产数据库 oceanba…

    2026年9月24日
    000
  • VSCode如何实现AI代码反混淆 VSCode智能分析混淆代码的技巧

    vscode没有一键ai反混淆功能,但可通过智能扩展、调试器、ast查看器、代码格式化工具及外部ai工具集成来辅助分析和逐步还原混淆代码;2. 利用eslint、prettier等扩展提升代码可读性,通过“重命名符号”“转到定义”“查找引用”等功能追踪变量和函数流向,结合多光标编辑和代码片段进行手动…

    2026年9月24日
    100
  • Laravel 表单验证失败后保留输入值:最佳实践教程

    本文旨在帮助 Laravel 开发者解决表单验证失败后,如何保留用户已输入数据的问题。我们将深入探讨 withInput() 方法的使用,并提供清晰的代码示例,确保即使在验证失败的情况下,用户体验也能保持流畅。通过本文的学习,你将掌握在 Laravel 中优雅地处理表单验证,并提升应用的可用性。 在…

    2026年9月24日
    000
  • 《明末:渊虚之羽》1.6更新奖励领不了?官方手把手教学来了!

    《明末:渊虚之羽》是一款类魂动作角色扮演游戏,故事发生在巴蜀之地,此时正值黑暗动荡的明末,战事四起,一场神秘的疫病催生了妖怪一般的生物。 今天早些时候我们曾报道,游戏官方发布了1.6版本更新公告,补丁大小约为5.3GB,其中包括豪华版专属内容、免费头饰和性能优化等内容。 官方表示,本次更新“豪华扩展…

    2026年9月24日
    100
  • VSCode 怎样配置终端默认路径 VSCode 终端默认路径的配置技巧​

    在 vscode 中配置终端默认启动路径需修改 terminal.integrated.cwd 设置项;2. 可通过用户设置(全局生效)或工作区设置(项目专属)进行配置,优先级为工作区设置覆盖用户设置;3. 路径可使用绝对路径或相对路径(推荐相对路径以提升协作性),windows 系统需注意反斜杠转…

    2026年9月24日
    000
  • iSlide预览功能如何开启_iSlide预览功能开启的完整指南

    首先确认iSlide插件已正确安装并显示在PowerPoint功能区,若未显示需重新安装;接着进入“iSlide”选项卡,使用“资源库”中主题或图表分类,将鼠标悬停于缩略图以触发预览;如无反应,检查是否已登录账户且网络畅通,避免防火墙限制;随后更新iSlide至最新版本,卸载旧版后从官网下载安装,并…

    2026年9月24日
    200
  • OriginOS 6 深度体验:当操作系统回归「体验为王」

    OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」

    2020 年,智能手机刚刚进入 5g 普及阶段,手机的硬件与软件都迎来了一次迭代浪潮——新形态的需求对操作系统的设计与交互都提出了诸多新的问题,originos 的首个版本,可以看作 vivo对这些问题的回答。 彼时,我曾有机会与 OriginOS 开发团队沟通,正如 OriginOS 的中文名原 …

    2026年9月24日 用户投稿
    100
  • 《Python完全自学教程》免费在线连载1.5

    《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5

    说明: 本节内容,是针对非计算机专业的读者提供的补充知识。 1.5 操作系统 本节不是全面介绍操作系统知识,是提醒读者从开发者的角度认识自己的操作系统——根据多年的经验,至少要能熟练使用一些命令完成常见操作。 首先要声明硬件设备,本书所演示的代码都是基于个人计算机( Personal Compute…

    2026年9月24日 用户投稿
    700
  • 探索VSCode Jupyter Notebook集成与扩展

    VSCode集成Jupyter Notebook提升开发效率,安装Jupyter扩展后可直接运行.ipynb文件,支持内核选择、Shift+Enter执行单元格、图表渲染及变量状态保留;结合Python扩展、Pylance、GitLens等工具,实现调试、智能提示、版本控制与代码转换,适合数据分析与…

    2026年9月24日
    000
  • Laravel Livewire 使用指南:构建交互式论坛的最佳实践

    本文旨在指导开发者如何在现有的 Laravel 项目中集成 Livewire,并以构建论坛为例,探讨 Livewire 组件的最佳使用方式和命名规范。文章将深入分析全页面组件和独立组件的选择,并提供实用的代码示例和建议,帮助开发者在保证项目结构清晰的前提下,充分利用 Livewire 的优势,构建高…

    2026年9月24日
    100
  • VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    vscode通过集成语言服务协议(lsp)、内置quick fixes和refactoring actions,并结合扩展如eslint、prettier等,实现代码自动修复与智能重构;2. 启用editor.formatonsave和editor.codeactionsonsave设置可在保存时自…

    2026年9月24日 用户投稿
    100
  • VSCode如何设置智能代码重构建议 VSCode自动化重构工具的配置优化

    vscode的智能代码重构建议不出现时,首先检查文件类型是否受支持、对应语言扩展是否安装启用、项目根目录是否有jsconfig.json或tsconfig.json等配置文件;2. 确保editor.lightbulb.enabled为true以显示灯泡提示;3. 通过设置editor.codeac…

    2026年9月24日
    700
  • 基于属性配置动态创建 Spring Boot Bean

    本文介绍了如何在 Spring Boot 应用中基于配置属性的值动态创建 Bean。通过使用 @ConditionalOnProperty 注解,可以根据指定的属性是否存在以及其值来决定是否创建某个 Bean,从而实现灵活的配置和 Bean 的动态加载。本文将提供详细的代码示例和使用说明,帮助开发者…

    2026年9月24日
    100
  • Laravel Blade中条件隐藏元素的优雅实践

    本文探讨了在Laravel Blade模板中如何高效地实现HTML元素的条件隐藏。针对传统@if-@else语句导致代码冗余的问题,教程提出使用Blade的内联三元运算符在style属性中动态控制display: none,从而避免重复代码,提升模板的可读性和维护性。此外,还将介绍如何利用CSS类和…

    2026年9月24日
    200
  • 三大运营商 eSIM 手机业务全面落地 办理渠道各有侧重

    10 月 14 日消息,日前,中国联通与中国移动正式获准开展 esim 手机运营服务的商用试验,中国电信也同步取得工信部颁发的 esim 手机商用试验许可,这意味着国内三大运营商在 esim 手机业务方面已全面进入实际应用阶段。 中国移动用户可选择前往线下营业厅办理 eSIM 相关业务,也可通过中国…

    2026年9月23日
    200

发表回复

登录后才能评论
关注微信