为什么我要两次打开我的csv?

时间:2015-03-06 15:42:51

标签: python csv

假设我有一个csv文件,我首先需要获取行数以初始化数组。然后我想用文件中的行填充数组(但只有一些列):

import csv
import numpy

with open('a_csv_file', 'rb') as f:
    num_row = sum(1 for row in f)
    myarray = numpy.empty(shape=(num_row, 50), dtype=numpy.int16)
    infileReader = csv.reader(f)
    for row in infileReader:
        row_number = infileReader.line_num - 1
        my_array[row_number] = [int(row[7])] + row[21:70]

但是,脚本不会进入行循环。但print infileReader确认了infileReader的存在。

现在我打开a_csv_file.csv两次,但我认为这不是pythonic:

with open('a_csv_file', 'rb') as f:
    num_row = sum(1 for row in f)

myarray = numpy.empty(shape=(num_row, 50), dtype=numpy.int16)

with open('a_csv_file', 'rb') as f:
    infileReader = csv.reader(f)
    for row in infileReader:
        row_number = infileReader.line_num - 1
        my_array[row_number] = [int(row[7])] + row[21:70]

为什么我必须两次打开csv文件?

2 个答案:

答案 0 :(得分:1)

当您遍历文件(计算长度)时,文件中的位置将保留在最后。当你尝试再次迭代它时,没有任何东西留下,所以没有输入循环。在创建csv.reader调用f.seek(0)之前返回到开始之前。

请参阅seek方法here

的文档

答案 1 :(得分:1)

当您打开文件时,您无法访问相同内容的两次。例如,如果您打开一个文件,并使用readLine()方法读取第一行,则在输出后,您将位于第二行,并且无法再访问第一行。

当你这样做时

num_row = sum(1 for row in f)

您正在遍历所有行,没有可用于csv阅读器的数据。

如果csv文件太重,要迭代两次所有行可能会有问题。

要避免打开文件,首先应使用csv.reader读取它,然后使用csv模块中的参数获取行数。

编辑1:

如果文件太大,你可以随时

file_rows = list(csv.reader(f))
num_row = len(rows)
for row in file_rows:
    # do something
相关问题