我正在读一个非常大的文件,所以我想用python的懒惰方法一次读10000次:
def read_file():
jd_records = []
file_name = "test.csv"
with open(file=file_name, mode='rt') as inf:
has_header = csv.Sniffer().has_header(inf.read(1024))
inf.seek(0)
incsv = csv.reader(inf, delimiter=",")
if has_header:
next(incsv)
while True:
row = next(incsv)
jd_records.append(row)
line_num += 1
if not line_num % 10000:
yield jd_records
这种方法的问题是: 我不能屈服于最后的约会,例如我有15555行,那么最后5555就不会收益
答案 0 :(得分:2)
发布的代码有几个问题。
循环外需要yield jd_records
,以发出剩余的记录。 (这会导致问题中提到的问题。)
jd_records
列表需要重置,例如使用del jd_records[:]
,在循环内yield
之后。如果没有这个,它将多次产生相同的记录。
在阅读完最后一个元素后,裸next(iterator)
将引发StopIteration
。您需要将其包装在try / except或(更好)使用for
循环中。
例如:
def read_file():
jd_records = []
file_name = "test.csv"
with open(file=file_name, mode='rt') as inf:
has_header = csv.Sniffer().has_header(inf.read(1024))
inf.seek(0)
incsv = csv.reader(inf, delimiter=",")
if has_header:
next(incsv)
for row in incsv:
jd_records.append(row)
line_num += 1
if not line_num % 10000:
yield jd_records
del jd_records[:]
if jd_records:
yield jd_records