Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 必须先运行readlines(),然后运行read()。有没有更有效的方法_Python 3.x_Pandas - Fatal编程技术网

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

Python 3.x 必须先运行readlines(),然后运行read()。有没有更有效的方法,python-3.x,pandas,Python 3.x,Pandas,这感觉像是一个愚蠢的问题,但问题来了 我有很多数据文件要处理,每个文件在主数据之前都有可变数量的前导行。处理要求我在序言中找到一些值,然后将主数据读入一个数组 从序言中,我需要能够做到的行数: 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.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()
,但要完成看似相对简单的任务,两次读取文件似乎效率低下。有没有更有效的方法结合这两种需求?

使用
readline()
而不是
readline()
。它将允许您读取任意数量的行,但只能读取文件的前言(而不是整个文件):

结果得到
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, ...)

谢谢-这比我的版本更有弹性。我仍然必须打开
csvfile
两次。我想知道是否有一种方法可以一步完成。@nick.sculthorpe打开文件两次不是问题。这是一种非常常见的操作。
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, ...)