您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 从文件中获取数据,而不是多次迭代它

5b51 2022/1/14 8:21:59 python 字数 3503 阅读 526 来源 www.jb51.cc/python

我创建了以下函数来从文件中提取数据.它工作正常,但对于较大的文件来说速度很慢.def get_data(file, indexes, data_start, sieve_first = is_float): file_list = list(file) for i in indexes: d_line = i+data_sta

概述

我创建了以下函数来从文件提取数据.它工作正常,但对于较大的文件来说速度很慢.

def get_data(file,indexes,data_start,sieve_first = is_float):
    file_list = list(file)
    for i in indexes:
        d_line = i+data_start
        for line in file_list[d_line:]:
            if sieve_first(line.strip().split(',')[0]):
                yield file_list[d_line].strip()
                d_line += 1
            else:
                break

def is_float(f):
    try:
        float(str(f))
    except:
        return False
    else:
        return True

with open('my_data') as f:
    data = get_data(f,index_list,3)

文件可能如下所示(为清晰起见,添加了行号):

line 1234567: # <-- INDEX
line 1234568: # +1
line 1234569: # +2
line 1234570:      8,17.0,23,6487.6
line 1234571:      8,6487.6
line 1234572:      8,6487.6
line 1234572:
line 1234572:
line 1234572:

通过上面的例子,将产生1234570到1234572行.

由于我的文件很大,有一些我不喜欢我的功能.

>首先是它将整个文件读入内存;我这样做,所以我可以使用行索引来解析数据.
>其次是文件中的相同行重复多次 – 这对于大文件来说非常昂贵.

我试图使用迭代器一次性完成文件,但却无法破解它.有什么建议?

这是一个例子:

from itertools import islice

def yield_specific_lines_from_file(filename,start,stop):
    with open(filename,'rb') as ifile:
        for line in islice(ifile,stop):
            yield line

lines = list(yield_specific_lines_from_file('test.txt',10,20))

如果您使用Python 3.3或更高版本,您还可以使用yield from语句简化此操作:

from itertools import islice

def yield_specific_lines_from_file(filename,'rb') as ifile:
        yield from islice(ifile,stop)

lines = list(yield_specific_lines_from_file('test.txt',20))

这不会缓存您已经从文件中读取的行.如果您想这样做,我建议您将所有读取行存储在字典中,并将行号作为键,并且只在需要时从文件提取数据.

总结

以上是编程之家为你收集整理的python – 从文件中获取数据,而不是多次迭代它全部内容,希望文章能够帮你解决python – 从文件中获取数据,而不是多次迭代它所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶