1

我假设我收到此错误是因为我两次读取相同的 CSV(我不完全理解为什么这是一个问题),但我需要下面的代码来执行以下两件事......

1)给我一个CSV中所有行的总数。

2)只给我前两行数据,让我显示给用户。

file = upload.filepath
#I READ THE FILE
file_read = csv.reader(file)

#GET THE COUNT I.E. 100 ROWS
row_count = sum(1 for row in file_read)

#ADD TO DATA JUST THE FIRST TWO ROWS THAT I WILL USE TO DISPLAY BACK TO THE USER
data = []
for i in range(2):
    data.append(file_read.next())

我怎样才能做到这一点?

4

3 回答 3

4

使用islice您可以执行以下操作:

from itertools import islice
import csv

with open('somefile') as fin:
    csvin = csv.reader(fin)
    firstn = list(islice(csvin, 2))
    rows = len(firstn) + sum(1 for row in csvin)

这使您不必读取文件然后寻找开始,并且将正确返回行数,并且文件将在之后或发生异常时自动关闭。

于 2013-04-22T10:09:47.950 回答
3

为什么不颠倒这两种说法呢?您可以阅读前两行使用您的:

#ADD TO DATA JUST THE FIRST TWO ROWS THAT I WILL USE TO DISPLAY BACK TO THE USER
data = []
for i in range(2):
    data.append(file_read.next())

然后对剩余的行进行行计数,并添加 2:

#GET THE COUNT I.E. 100 ROWS
row_count = 2 + sum(1 for row in file_read)

但是,如果您有 <2 行,则会给出不正确的结果。更好的解决方案可能是简单地读入整个文件,然后计算结果列表中的行数。

import csv

# Open the file upload.filepath, get a pointer in file
# file automatically closed at end of 'with' context
with open(upload.filepath, 'r') as file:

    #I READ THE FILE
    file_read = csv.reader(file)

    data = []
    for row in file_read:
        data.append(row)

    rows = len(data)
    first_two_rows = data[:2]

如果它是一个庞大的文件,并且您担心内存,您可以添加一个计数变量,并且仅在其 <=2 时附加到数据

data = []
rows = 0
for row in file_read:
    rows += 1
    if rows<3:
        data.append(row)
于 2013-04-22T10:02:22.323 回答
1

您应该执行以下操作:

f = open('test.csv')

reader = csv.reader(f)
row_count = sum(1 for each in reader)

f.seek(0)  #reposition

data = []
for i in range(2):
    data.append(reader.next())

f.close()
于 2013-04-22T10:00:37.283 回答