【发布时间】:2016-07-05 19:47:26
【问题描述】:
我创建了以下函数来从文件中提取数据。它工作正常,但对于较大的文件会变得非常慢。
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, 17.0, 23, 6487.6
line 1234572: 8, 17.0, 23, 6487.6
line 1234572:
line 1234572:
line 1234572:
在上面的例子中,将产生第 1234570 到 1234572 行。
由于我的文件很大,所以我不喜欢我的功能。
- 首先是将整个文件读入内存;我这样做是为了可以使用行索引来解析数据。
- 其次,文件中的相同行被迭代了很多次——这对于大文件来说非常昂贵。
我一直在尝试使用迭代器一次通过文件,但无法破解它。有什么建议?
【问题讨论】:
-
只做
for line in file而不是list(file) -
@cricket_007 谢谢,但如果
file不支持索引,则该函数的其余部分将不起作用。 -
如果文件不支持索引,那么
file[d_line:]怎么样? -
@cricket_007 行
file = list(file)将其变成list。 -
@RickTeachey 我知道
list()会返回什么:)
标签: python function file python-3.x