Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 从文件中获取数据,而无需多次迭代_Python_Function_File_Python 3.x - Fatal编程技术网

Python 从文件中获取数据,而无需多次迭代

Python 从文件中获取数据,而无需多次迭代,python,function,file,python-3.x,Python,Function,File,Python 3.x,我创建了以下函数来从文件中提取数据。它工作正常,但对于较大的文件来说速度非常慢 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

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

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)
文件可能如下所示(为清晰起见添加了行号):


第1234567行:#如果您只需要文件的一小部分,我会使用。此函数将不存储任何数据,而是将所需的数据存储在内存中

下面是一个例子:

from itertools import islice

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

lines = list(yield_specific_lines_from_file('test.txt', 10, 20))
如果使用Python 3.3或更高版本,还可以使用以下语句简化此过程:

from itertools import islice

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

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

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

有点左外野。但是,如果您可以控制文件,则可以将数据移动到SQLITE3DB

还可以查看mmap和linecache。我想后两个只是随机访问文件的包装。i、 你可以通过扫描文件一次,然后建立一个索引->偏移量查找表并使用seek来滚动你自己的文件

其中一些方法假设您对正在读取的文件具有某种控制权


这还取决于你是否经常读写(如果这样的话,建立索引不是一个坏主意)。

只需对文件中的行执行
,而不是
列表(文件)
@cricket\u 007谢谢,但是如果
文件
不支持索引,其余的函数将无法工作。如果文件不支持索引,那你过得怎么样?@cricket\u 007这行
file=list(file)
把它变成了一个
列表
@RickTeachey我知道
list()
返回什么:)读了很多,写了几乎从来没有,但可能是偶尔。好主意-谢谢!看来我需要的是
islice
。仍然需要多次迭代,但这种方式成本要低得多。谢谢
from itertools import islice

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

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