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))