CSV文件中的行数统计

29

我可能犯了一个愚蠢的错误,但我找不到原因。我想要计算我的csv文件中的行数。我写了这个代码,明显它没有起作用:row_count = 0 ,而实际应该是400。谢谢。

f = open(adresse,"r")
reader = csv.reader(f,delimiter = ",")
data = [l for l in reader]
row_count = sum(1 for row in reader)

print row_count

可能是如何在Python中计算CSV文件的行数?的重复问题。 - AjayKumarBasuthkar
这个回答解决了你的问题吗?如何在Python中以低成本获取大文件的行数? - Matthew Strawbridge
这种情况发生的原因是因为读取器通过创建“data”列表而“清空”了自身。一旦你遍历完它,它就消失了。这就是为什么在那个时候row_count被读取为0的原因:在读取器中没有剩余的内容了。 - Erdős-Bacon
7个回答

43
with open(adresse,"r") as f:
    reader = csv.reader(f,delimiter = ",")
    data = list(reader)
    row_count = len(data)

在保存data列表后,文件指针已经到达文件末尾,您正在尝试两次读取文件。


1
只是一个提醒:如果您在读取器上使用列表,将会失去其生成器的优势。 - MikeL
1
这会通过创建列表将潜在的大量数据读入内存(虽然是短暂的)。如果我们想要条目计数,我认为最好只做类似于 entry_count = sum(1 for row in reader) 的操作,如果我们想要计算文件中的所有行数(包括标题行),则可以使用 line_count = sum(1 for line in f) - Erdős-Bacon
@Erdős-Bacon 我只是在修复原帖的代码,但那是正确的。 - jamylak
如果你需要在计算行数后检查文件的内容,你需要将文件指针重置到文件的开头。# 重置文件指针以进行迭代 csv_file.seek(0) next(reader) # 跳过标题行 - undefined

7

首先,您必须使用open打开文件:

input_file = open("nameOfFile.csv","r+")

然后使用 csv.reader 打开 csv 文件:
reader_file = csv.reader(input_file)

最后,您可以使用指令len获取行数:
value = len(list(reader_file))

完整的代码如下:

input_file = open("nameOfFile.csv","r+")
reader_file = csv.reader(input_file)
value = len(list(reader_file))

请记住,如果您想要重复使用csv文件,则必须进行input_file.fseek(0)操作,因为当您使用列表作为reader_file时,它会读取整个文件,并且文件中的指针会改变其位置。


2

我建议使用生成器。它可以完成工作并保护您免受任何类型的MemoryError

def generator_count_file_rows(input_file):
    for row in open(input_file,'r'):
        yield row

然后

for row in generator_count_file_rows('very_large_set.csv'):
        count+=1

我喜欢这个@hellbreak。你有类似的计算列的解决方案吗? - nick

2

如果您正在使用python3并安装了pandas库,可以使用以下方法:

import pandas as pd

results = pd.read_csv('f.csv')

print(len(results))

1

重要的内容隐藏在被标记为正确答案的解决方案的注释部分。

在这里重新分享Erdős-Bacon的解决方案以获得更好的可见性。

为什么? 因为:它可以节省大量内存而无需创建列表。

所以我认为这样做更好。


def read_raw_csv(file_name):
    with open(file_name, 'r') as file:
        csvreader = csv.reader(file)

        # count number of rows
        entry_count = sum(1 for row in csvreader)
        print(entry_count-1)  # -1 is for discarding header row.

点击此链接获取更多信息。


0
# with built in libraries
opened_file = open('f.csv')
from csv import reader

read_file = reader(opened_file)
apps_data = list(read_file)

rowcount = len(apps_data) #which incudes header row

print("Total rows incuding header: " + str(rowcount))

-6

只需在Notepad++中打开csv文件,即可快速显示总行数。 :) 或者在cmd提示符中,提供文件路径并输入命令 find \c \v "一些无意义的字符串" 文件名.csv


3
楼主想知道如何修复 Python 脚本。 - line-o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接