必须先运行readlines(),然后再运行read()。有没有更有效的方法

时间:2018-09-28 05:53:54

标签: python-3.x pandas

这感觉像一个愚蠢的问题,但是就这样。

我有很多数据文件要处理,每个文件在主数据前都有可变数量的前导行。处理需要在序言中找到一些值,然后将主要数据读入pandas df。

从序言中,我需要可以执行的行数:

with open(csvfile) as f:
data = f.readlines()
for num, line in enumerate(data, 0):
    if end_preamble in line:
        lines = num

我还需要在前导中找到一些值,这些值是处理后续数据所需的。我也可以这样做:

with open(csvfile) as f:
    data = f.read()
term1 = re.finall...(regex term)..

这两种方法都有效,但是read()不会返回行号,因为(据我所知)它将文本解释为一行。反之,readlines()不能为字符串重新赋形(我认为是因为它没有存储-但我很可能错了)。

我现在有以下技巧:

with open(csvfile) as f:
    data = f.read(250)
lines = data.count('\n')
term1 = re.finall.....

这是可行的,因为在大多数情况下,前导的长度小于250个字节。但是,如果我的文件前序很短或很长,那么它将无法正常工作。

文件不是很大,所以我既可以使用readlines()也可以使用read(),但是两次读取文件似乎是一种效率低下的方法,无法完成看起来相对琐碎的任务。有没有更有效的方法来结合这两种需求?

1 个答案:

答案 0 :(得分:2)

使用readline()代替readlines()。它将允许您读取任意数量的行,但仅读取文件的前导(而不是整个文件):

with open(csvfile) as f:
    num = 0
    while end_preamble not in f.readline():
        num += 1

结果是得到num,它是前导中最后一行的编号。

编辑。

如果您只想打开文件一次(容易出错),则可以这样操作:

with open(csvfile, mode='rb') as f:
    preamble = b''
    line = f.readline()
    while end_preamble.encoded('UTF-8') not in line:
        preamble += line
    preamble = preamble.decoded('UTF-8')

    data = pandas.read_table(f, ...)