如何使用Python解析由冒号分隔的具有不同数据类型和不断变化但结构一致的文本文件

如何使用Python解析由冒号分隔的具有不同数据类型和不断变化但结构一致的文本文件,python,regex,parsing,Python,Regex,Parsing,我有一个数据采集程序,它给了我一个头文件和一个数据文件,我需要对它们进行解析,以便进行一些计算。头文件包含大约一百多个变量,这些变量遵循下面示例头中的模式 示例标题: fileName : C:\Path\To\File\prefix.289.13.name.00000.ext date : 2013-10-16 15:46:16.978 EDT var1 (unit) :

我有一个数据采集程序,它给了我一个头文件和一个数据文件,我需要对它们进行解析,以便进行一些计算。头文件包含大约一百多个变量,这些变量遵循下面示例头中的模式

示例标题:

fileName :                              C:\Path\To\File\prefix.289.13.name.00000.ext
date :                                  2013-10-16 15:46:16.978 EDT
var1 (unit) :                           1381952777
var2 (unit) :                           [ 10000 0 0 0  ]
var3 (0.1unit) :                        400
var4 (unit):                            1.03125
var5 :                                  3
var6 (description (unit)) :
[ 1.1 -0.5 0.1 ]
[ 1.1 -0.5 0.1 ]
[ 1.1 -0.5 0.1 ]


          COMMENTS
------------------------------
fileName = C:\Path\To\File\prefix.289.13.name.00000.hdr
date = 2013-10-16 15:46:16.978 EDT
var1 = 1381952777
var2 = np.array( [10000, 0, 0, 0] )
var3 = 40.0
var4 = 1.03125
var5 = 3
var6 = np.array([1.1, -0.5, 0.1],[2.1, 0.01, 0.5],[3.2, 0.4, 1.2])
其中
var5
给出
var6
矩阵中的行数。除最后一种情况外,所有变量都用冒号与其值隔开。在变量名和冒号之间的括号中可以指定单位,也可以不指定单位。当指定单位时,有时还会在单位前添加比例因子。值可以是字符串、日期、整数、浮点或整数或浮点数组。最后一个值与不需要的注释部分之间用几行空行隔开

预期输出:

fileName :                              C:\Path\To\File\prefix.289.13.name.00000.ext
date :                                  2013-10-16 15:46:16.978 EDT
var1 (unit) :                           1381952777
var2 (unit) :                           [ 10000 0 0 0  ]
var3 (0.1unit) :                        400
var4 (unit):                            1.03125
var5 :                                  3
var6 (description (unit)) :
[ 1.1 -0.5 0.1 ]
[ 1.1 -0.5 0.1 ]
[ 1.1 -0.5 0.1 ]


          COMMENTS
------------------------------
fileName = C:\Path\To\File\prefix.289.13.name.00000.hdr
date = 2013-10-16 15:46:16.978 EDT
var1 = 1381952777
var2 = np.array( [10000, 0, 0, 0] )
var3 = 40.0
var4 = 1.03125
var5 = 3
var6 = np.array([1.1, -0.5, 0.1],[2.1, 0.01, 0.5],[3.2, 0.4, 1.2])
理想情况下,所有变量都会包含在字典中,但我对这一点还不够了解,所以我会接受建议。有了这些变量,我将能够找到数据文件和它的维度数组,它们是巨大的

我迄今为止的尝试:

fileName :                              C:\Path\To\File\prefix.289.13.name.00000.ext
date :                                  2013-10-16 15:46:16.978 EDT
var1 (unit) :                           1381952777
var2 (unit) :                           [ 10000 0 0 0  ]
var3 (0.1unit) :                        400
var4 (unit):                            1.03125
var5 :                                  3
var6 (description (unit)) :
[ 1.1 -0.5 0.1 ]
[ 1.1 -0.5 0.1 ]
[ 1.1 -0.5 0.1 ]


          COMMENTS
------------------------------
fileName = C:\Path\To\File\prefix.289.13.name.00000.hdr
date = 2013-10-16 15:46:16.978 EDT
var1 = 1381952777
var2 = np.array( [10000, 0, 0, 0] )
var3 = 40.0
var4 = 1.03125
var5 = 3
var6 = np.array([1.1, -0.5, 0.1],[2.1, 0.01, 0.5],[3.2, 0.4, 1.2])
我正在使用python解析文件。我的第一个方法是

hdr = 'C:\Path\To\File\prefix.289.13.name.00000.hdr'
with open(hdr, 'r') as header:
    for line in header:
        # Stop at the first Line Feed or Carriage Return
        if line in  ['\n', '\r\n']:
            break
        else:
            (' '.join(line.strip().split(':')).split())
只要不是数组,变量名作为列表的第一个元素,值作为最后一个元素就足够了。因为冒号,它把文件名和日期搞糟了,因为方括号,它把数组搞糟了

我的第二次尝试涉及正则表达式:

import re
hdr = 'C:\Path\To\File\prefix.289.13.name.00000.hdr'
with open(hdr, 'r') as header:
    for line in header:
        # Stop at the first Line Feed or Carriage Return
        if line in  ['\n', '\r\n']:
            break
        else:
            m = re.search('\w*', line)
            if m:
                m.group()
            else:
                print 'No match'
使用这种方法,我成功地获得了变量名,直到文件的最后一部分,其中向量前面没有变量名,变量名输出空字符串。我将正则表达式更改为
\w+
,然后最后一部分输出向量第一个元素的第一个数字。正是在这一点上,我向自己承认,我并不比一个蒙着眼睛在皮涅塔荡秋千的人强多少。我来了

我的问题是,我应该如何处理这个问题?这是一个模糊的问题,但是我在这个网站上发现的关于解析的所有其他问题都有格式良好的文件

下面是一些伪代码(假设您的头永远不会有错误):


注意:这可能会有很多错误,但您应该了解总体思路:)

当然,在某些情况下,这样做的复杂性超过了编写自己的自定义算法所需的工作量。请修复变量名,我认为您在示例标题中重复了var4两次。当然,您必须遍历此文件,并检查不同类型的内容是否匹配。显然,“文件名”和“日期”似乎总是在意料之中。在这之后,你有一堆变量。@sabiram,修复了变量名。事实上,我的一般方法是逐行浏览文件,逐行阅读,将其与匹配的案例进行比较,然后以这种方式操作。我非常坚持将其与匹配的案例部分进行比较。@GreatBigBore,我并不反对。我只是不知道该怎么办。谢谢!这给了我一个新的起点。我仍在试图用正则表达式来表达我的想法,但我相信我会做到的。-这是一个试图破译正则表达式的很棒的工具