145

I'm using python (Django Framework) to read a CSV file. I pull just 2 lines out of this CSV as you can see. What I have been trying to do is store in a variable the total number of rows the CSV also.

How can I get the total number of rows?

file = object.myfilePath
fileObject = csv.reader(file)
for i in range(2):
    data.append(fileObject.next()) 

I have tried:

len(fileObject)
fileObject.length
4

18 回答 18

228

您需要计算行数:

row_count = sum(1 for row in fileObject)  # fileObject is your csv.reader

使用sum()生成器表达式可以提高计数器的效率,避免将整个文件存储在内存中。

如果您已经阅读了 2 行,那么您需要将这 2 行添加到总数中;已经读取的行不被计算在内。

于 2013-04-19T15:51:48.960 回答
85

2018-10-29 编辑

谢谢你的意见。

我测试了几种代码,以获取 csv 文件中在速度方面的行数。最好的方法如下。

with open(filename) as f:
    sum(1 for line in f)

这是测试的代码。

import timeit
import csv
import pandas as pd

filename = './sample_submission.csv'

def talktime(filename, funcname, func):
    print(f"# {funcname}")
    t = timeit.timeit(f'{funcname}("{filename}")', setup=f'from __main__ import {funcname}', number = 100) / 100
    print('Elapsed time : ', t)
    print('n = ', func(filename))
    print('\n')

def sum1forline(filename):
    with open(filename) as f:
        return sum(1 for line in f)
talktime(filename, 'sum1forline', sum1forline)

def lenopenreadlines(filename):
    with open(filename) as f:
        return len(f.readlines())
talktime(filename, 'lenopenreadlines', lenopenreadlines)

def lenpd(filename):
    return len(pd.read_csv(filename)) + 1
talktime(filename, 'lenpd', lenpd)

def csvreaderfor(filename):
    cnt = 0
    with open(filename) as f:
        cr = csv.reader(f)
        for row in cr:
            cnt += 1
    return cnt
talktime(filename, 'csvreaderfor', csvreaderfor)

def openenum(filename):
    cnt = 0
    with open(filename) as f:
        for i, line in enumerate(f,1):
            cnt += 1
    return cnt
talktime(filename, 'openenum', openenum)

结果如下。

# sum1forline
Elapsed time :  0.6327946722068599
n =  2528244


# lenopenreadlines
Elapsed time :  0.655304473598555
n =  2528244


# lenpd
Elapsed time :  0.7561274056295324
n =  2528244


# csvreaderfor
Elapsed time :  1.5571560935772661
n =  2528244


# openenum
Elapsed time :  0.773000013928679
n =  2528244

总之,sum(1 for line in f)是最快的。但可能与 没有显着差异len(f.readlines())

sample_submission.csv是 30.2MB,有 3100 万个字符。

于 2016-05-02T01:46:33.087 回答
19

为此,您需要有一些代码,例如我的示例:

file = open("Task1.csv")
numline = len(file.readlines())
print (numline)

我希望这对每个人都有帮助。

于 2015-10-19T13:29:07.243 回答
13

上面的几个建议计算了 csv 文件中的 LINES 数。但是一些 CSV 文件将包含引用的字符串,这些字符串本身包含换行符。MS CSV 文件通常用 \r\n 分隔记录,但在带引号的字符串中单独使用 \n。

对于这样的文件,计算文件中的文本行数(由换行符分隔)会产生太大的结果。因此,为了准确计数,您需要使用 csv.reader 来读取记录。

于 2016-07-15T12:48:38.967 回答
8

首先你必须用 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 的列表时,它会读取所有文件,并且文件中的指针会更改其位置

于 2017-06-01T10:21:11.580 回答
6

row_count = sum(1 for line in open(filename)) worked for me.

Note : sum(1 for line in csv.reader(filename)) seems to calculate the length of first line

于 2018-03-10T18:03:16.493 回答
5

使用方法迭代整个文件后csv.reader(),您可以通过实例变量读取总行数 line_num

import csv
with open('csv_path_file') as f:
    csv_reader = csv.reader(f)
    for row in csv_reader:
        pass
    print(csv_reader.line_num)

引用官方文档

csvreader.line_num

从源迭代器读取的行数。

小警告:

  • 总行数,包括标题(如果 CSV 有)。
于 2019-05-27T09:21:46.807 回答
4

这适用于 csv 和基于 Unix 的操作系统中包含字符串的所有文件:

import os

numOfLines = int(os.popen('wc -l < file.csv').read()[:-1])

如果 csv 文件包含字段行,您可以从numOfLines上面扣除一个:

numOfLines = numOfLines - 1
于 2016-08-18T23:00:21.013 回答
3
numline = len(file_read.readlines())
于 2013-04-19T15:53:58.310 回答
3

我认为我们可以稍微改进一下最佳答案,我正在使用:

len = sum(1 for _ in reader)

此外,我们不应该忘记 pythonic 代码并不总是在项目中具有最佳性能。例如:如果我们可以在同一个数据集中同时进行更多操作,最好在同一个 bucle 中完成所有操作,而不是制作两个或多个 pythonic bucle。

于 2019-05-17T09:55:59.790 回答
2

您还可以使用经典的 for 循环:

import pandas as pd
df = pd.read_csv('your_file.csv')

count = 0
for i in df['a_column']:
    count = count + 1

print(count)
于 2020-06-13T15:23:40.633 回答
2
import csv
count = 0
with open('filename.csv', 'rb') as count_file:
    csv_reader = csv.reader(count_file)
    for row in csv_reader:
        count += 1

print count
于 2016-01-25T11:45:34.313 回答
2
import pandas as pd
data = pd.read_csv('data.csv') 
totalInstances=len(data)
于 2019-10-02T18:22:46.517 回答
2

使用“列表”来适应更可行的对象。

然后,您可以计数、跳过、变异,直到您的心愿:

list(fileObject) #list values

len(list(fileObject)) # get length of file lines

list(fileObject)[10:] # skip first 10 lines
于 2016-09-08T17:15:53.183 回答
1

可能想在命令行中尝试如下简单的操作:

sed -n '$=' filename

或者

wc -l filename
于 2015-10-20T05:02:53.710 回答
0

如果您必须解析 CSV(例如,由于字段中存在换行符或注释掉的行)但 CSV 太大而无法一次全部容纳内存,您可以逐个解析 CSV:

import pandas as pd
import os
import sys

csv.field_size_limit(sys.maxsize)  # increase the maximal line length in pd.read_csv()

cnt = 0
for chunk in pd.read_csv(filepath, chunksize=10**6):
    cnt += len(chunk)
print(cnt)
于 2021-05-20T13:23:09.467 回答
-1

尝试

data = pd.read_csv("data.csv")
data.shape

在输出中您可以看到类似 (aa,bb) 的内容,其中 aa 是行数

于 2019-03-18T02:28:05.203 回答
-1

如果你在 Unix 系统上工作,最快的方法是下面的 shell 命令

cat FILE_NAME.CSV | wc -l

在 Jupyter Notebook 或 iPython 中,您可以将其与!

! cat FILE_NAME.CSV | wc -l
于 2021-02-15T15:28:35.530 回答