解析一系列固定宽度的文件

时间:2015-01-26 13:22:17

标签: python parsing schema

我有一系列(~30)个文件由以下行组成:

xxxxnnxxxxxxxnnnnnnnxxxnn

其中x是char,n是数字,每个组都是不同的字段。

这对每个文件都是固定的,因此很容易用结构或切片进行拆分和读取;但是我想知道是否有一种有效的方法可以为很多文件(每个文件具有不同的字段和长度)进行操作而无需对其进行硬编码。

我的一个想法是创建一个包含每个文件架构的XML文件,然后我可以在需要时动态添加新文件,代码更便携,但我想检查没有更简单/更标准的方法这样做。

如果这有帮助,我将把数据输出到Redis或ORM中,并且每个文件只会被处理一次(尽管在以后的日期会添加具有不同结构的其他文件)。

由于

2 个答案:

答案 0 :(得分:1)

您可以使用itertools.groupby,例如str.isdigit(或isalpha):

>>> line = "aaa111bbb22cccc345defgh67"
>>> [''.join(i[1]) for i in itertools.groupby(line,str.isdigit)]
['aaa', '111', 'bbb', '22', 'cccc', '345', 'defgh', '67']

答案 1 :(得分:1)

我认为@ fredtantini的回答包含了一个很好的建议 - 这里有一个充实的方法,可以将它应用到您的问题中,加上my answer中代码的微小变化,标题为高效方式解析Python中的固定宽度文件

from itertools import groupby
from struct import Struct
isdigit = str.isdigit

def parse_fields(filename):
    with open(filename) as file:
        # determine the layout of fields from the first line of the file
        firstline = file.readline().rstrip()
        fieldwidths = (len(''.join(i[1])) for i in groupby(firstline, isdigit))
        fmtstring = ''.join('{}s'.format(fw) for fw in fieldwidths)
        parse = Struct(fmtstring).unpack_from
        file.seek(0)  # rewind
        for line in file:
            yield parse(line)

for row in parse_fields('somefile.txt'):
    print(row)