如何从 Python 中的 CSV 文件获得行的总数?

我使用 python (Django Framework)读取 CSV 文件。如你所见,我只从这个 CSV 中提取了两条线。我一直在尝试做的是存储在一个变量的总行数的 CSV 也。

如何得到行的总数?

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

我试过了:

len(fileObject)
fileObject.length
318911 次浏览

您需要计算行数:

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

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

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

numline = len(file_read.readlines())

要做到这一点,你需要像我这里的例子一样有一点代码:

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

我希望这对大家都有帮助。

可能需要在命令行中尝试下面这样简单的操作:

sed -n '$=' filename

或者

wc -l filename
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

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.2 MB,有3100万个字符。

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

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

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

import os


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

如果 csv 文件包含一个字段行,你可以从上面的 numOfLines中减去一个:

numOfLines = numOfLines - 1

使用“列表”,以适应一个更可行的对象。

然后,你可以数数,跳过,变异,直到你的心的愿望:

list(fileObject) #list values


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


list(fileObject)[10:] # skip first 10 lines

首先你必须打开文件

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。Ffind (0) ,因为当您为 reader _ file 使用一个列表时,它会读取所有文件,文件中的指针会改变它的位置

row_count = sum(1 for line in open(filename))为我工作。

注: sum(1 for line in csv.reader(filename))似乎是计算第一行的长度

试试看

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

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

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

len = sum(1 for _ in reader)

此外,我们不应该忘记 Python 代码并不总是在项目中有最好的性能。例如: 如果我们可以在同一个数据集中同时进行更多的操作,那么最好在同一个小节中进行所有操作,而不是创建两个或更多的 Python 小节。

在使用 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)

引用 官方文件:

Line _ num

从源迭代器读取的行数。

小小的警告:

  • 总行数,包括标题,如果 CSV 有。
import pandas as pd
data = pd.read_csv('data.csv')
totalInstances=len(data)

你也可以使用经典的 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)

如果您正在使用 Unix 系统,最快的方法是下面的 shell 命令

cat FILE_NAME.CSV | wc -l

在 Jupiter Notebook 或 iPython 中,你可以使用 !:

! cat FILE_NAME.CSV | wc -l

如果您必须解析 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)

我认为我的方法是最简单的:

import csv
file = open(filename, 'r')
csvfile = csv.reader(file)
file.close
print("row", len(list(csvfile)))