阅读复杂文件的提示 - Python

时间:2015-02-12 12:01:31

标签: python python-2.7 text-parsing

我有复杂的,可变的文本文件,我想读入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”关键字,然后在其后面记录数字,然后在下一行中搜索样本,依此类推。但是,如果在“注释”部分中使用关键字,这当然不起作用。

所以,我有点难以满足我的需求(如果你不知道它存在的话就很难用东西!)

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

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

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

(相对)简单的scannlerless parser基于行DFA和前面提到的一组正则表达式可以应用:

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

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