【问题标题】:Tips for reading in a complex file - Python读取复杂文件的技巧 - Python
【发布时间】:2015-04-13 03:47:12
【问题描述】:

我有复杂的可变文本文件,我想将其读入 Python,但我不确定最佳策略是什么。我不是在找你为我编写任何代码,只是一些关于哪些模块最适合我的需求/提示等的提示。

文件看起来像:

Program
Username: X    Laser: X     Em: X

exp 1
    sample 1
        Time: X    Notes: X
        Read 1 X data
        Read 2 X data
        # unknown number of reads
    sample 2
        Time: X    Notes: X
        Read 1 X data
        ...
    # Unknown number of samples

exp 2
    sample 1
    ...
# Unknown number of experiments, samples and reads
# The 4 spaces between certain words represent tabs

要分析这些数据,我需要获取每个读数的数据,并知道它来自哪个样本和实验。另外,我可以更改输出文件格式,但我认为我在这里编写它的方式是最容易阅读的。

要将这个文件读入 Python,我能想到的最好方法是逐行读取并使用正则表达式搜索关键词。例如,搜索“exp”关键字的行,然后记录它后面的数字,然后在下一行搜索sample,依此类推。但是,如果在“注释”部分使用关键字,这当然不会起作用。

所以,我有点不知道什么最适合我的需求(如果你不知道它存在,就很难使用它!)

感谢您的宝贵时间。

【问题讨论】:

  • 查看 Ned Batchelder 的 Python Parsing Tools 列表。
  • 通常人类易于阅读的格式并不容易被程序准备好。可能值得拥有一个输出到的中间格式和两个程序 - 一个用于漂亮地打印它,另一个用于进行分析。

标签: python python-2.7 text-parsing


【解决方案1】:

这是syntactic analyzer 的典型任务。在这种情况下,由于

  • 词法结构不跨越行边界,每行只有一个结构(“语句”)。换句话说,每一行都是一个语句
  • 一组正则表达式可以涵盖单行的完整语法
  • 化合物的结构(=将多个“陈述”连接成更大的东西的实体)简单明了

一个(相对)简单的scannlerless parser基于行,DFA和上述的正则表达式集可以应用:

  • 设置初始解析器状态(=相对于要跟踪的各种实体的当前位置)和解析树(=以方便的方式表示来自文件的信息的数据结构)
  • 对于每一行
    • 对其进行分类,例如通过匹配适用于当前状态的正则表达式
    • 使用匹配的正则表达式的组来获取该行语句的有意义的部分
    • 使用这些部分,更新状态和解析树

有关示例,请参阅get the path in a file inside {} by python。在那里,我不构造解析树(不需要),而只跟踪当前状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2012-07-29
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多