如何在python中生成10000行文件?

时间:2015-04-27 09:59:46

标签: python yield

我正在读一个非常大的文件,所以我想用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就不会收益

1 个答案:

答案 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