我有一系列(~30)个文件由以下行组成:
xxxxnnxxxxxxxnnnnnnnxxxnn
其中x是char,n是数字,每个组都是不同的字段。
这对每个文件都是固定的,因此很容易用结构或切片进行拆分和读取;但是我想知道是否有一种有效的方法可以为很多文件(每个文件具有不同的字段和长度)进行操作而无需对其进行硬编码。
我的一个想法是创建一个包含每个文件架构的XML文件,然后我可以在需要时动态添加新文件,代码更便携,但我想检查没有更简单/更标准的方法这样做。
如果这有帮助,我将把数据输出到Redis或ORM中,并且每个文件只会被处理一次(尽管在以后的日期会添加具有不同结构的其他文件)。
由于
答案 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)