如何在Python中读取具有可变多行数据的文件

2024-09-30 16:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约100Mb的文件,看起来像这样:

#meta data 1    
skadjflaskdjfasljdfalskdjfl
sdkfjhasdlkgjhsdlkjghlaskdj
asdhfk
#meta data 2
jflaksdjflaksjdflkjasdlfjas
ldaksjflkdsajlkdfj
#meta data 3
alsdkjflasdjkfglalaskdjf

此文件包含一行元数据,该行与仅包含字母数字字符的多个可变长度数据相对应。将这些数据读入这样一个简单列表的最佳方法是:

^{pr2}$

我最初的想法是使用read()方法将整个文件读入内存,然后使用正则表达式将数据解析为所需的格式。有没有更好的Python式的方法?所有元数据行都以octothorpe开头,所有数据行都是字母数字。谢谢!在


Tags: 文件数据方法列表data字母数字字符
3条回答

我猜是这样的:

result = []
for line in file.readlines():
    if line[0] == '#':
        result.append([line])
    else:
        if len(result[-1]) == 1:
            result[-1].append(line)
        else:
            result[-1][-1] += line

未经测试。在

我不知道这是否是最快的方法,但从我的头脑中:

data = []
with open('input.file', 'r') as fp:
    for line in fp:
        line = line.strip()
        if line[0] == '#':
            data.append((line, []))
        else:
            data[-1][1].append(line)
data = [(X, ''.join(Y)) for X, Y in data]

itertools.groupby提供了一种将行收集到组中的简单方法:

import itertools

data=[]
with open('data.txt','r') as f:
    for key,group in itertools.groupby(f,lambda line: line.startswith('#meta')):
        if key:
            meta=next(group).strip()
        else:
            lines=''.join(group).strip()
            data.append((meta,lines))
print(data)            

收益率

^{pr2}$

表达式

itertools.groupby(f,lambda line: line.startswith('#meta'))

返回迭代器。它循环遍历f中的行,并在每一行上调用lambda函数。当遇到以#meta开头的行时,该函数返回True,否则返回{}。在

itertools.groupby收集返回相同值的所有连续行。在

因此,以#meta开头的行放在它自己的组中,然后所有不以#meta开头的行放在下一个组中,依此类推。在

keylambda函数的返回值。在本例中,它将是True或{}。在

相关问题 更多 >