这感觉像一个愚蠢的问题,但是就这样。
我有很多数据文件要处理,每个文件在主数据前都有可变数量的前导行。处理需要在序言中找到一些值,然后将主要数据读入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()
,但是两次读取文件似乎是一种效率低下的方法,无法完成看起来相对琐碎的任务。有没有更有效的方法来结合这两种需求?
答案 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, ...)