计算CSV Python中有多少行?


108

我正在使用python(Django Framework)读取CSV文件。如您所见,我仅从该CSV中提取了2行。我一直在尝试将CS​​V的总行数存储在变量中。

如何获得总行数?

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

我努力了:

len(fileObject)
fileObject.length

1
什么file_read啊 它是文件句柄file_read = open("myfile.txt")吗(如?
David Robinson

1
file_read = csv.reader(file)更新的问题现在应该有意义。
GrantU 2013年

看看这个问题,以获取有关该主题的想法:stackoverflow.com/questions/845058/…–
粉碎

Answers:


181

您需要计算行数:

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

使用sum()与发电机表达使一个有效的计数器,从而避免在存储器中存储整个文件。

如果您已经开始阅读两行,那么您需要将这两行加到总计中;已读取的行不计在内。


1
谢谢。那行得通,但是我必须首先阅读这些行吗?似乎有点打击?
GrantU 2013年

4
必须阅读各行;不能保证这些行的大小是固定的,因此计数它们的唯一方法是全部读取它们。
马丁·彼得斯

1
@Escachator:您在哪个平台上?文件中是否有EOF(CTRL-Z,\x1A)字符?您是如何打开文件的?
马丁·彼得斯

4
@Escachator:您的文件名包含53个字符。读取器采用可迭代或打开的文件对象,但不采用文件名。
马丁·彼得斯

6
请注意,如果您想再次遍历读取器(例如,要处理行),则需要重置迭代器,然后重新创建读取器对象:file.seek(0)然后fileObject = csv.reader(file)
KevinTydlacka

67

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万个字符。


您还应该关闭文件吗?节省空间?
lesolorzanov

1
为什么在结论中您更喜欢sum()而不是len()?Len()在您的结果中更快!
jorijnsmit

好答案。一加。尽管速度较慢,但​​是for row in csv_reader:当根据rfc4180假定CSV包含有效的带引号的换行符时,应首选解决方案。@dixhom您测试过的文件有多大?
西蒙·朗

16

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

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

希望对大家有帮助。


1
我喜欢这个简短的答案,但比Martijn Pieters的答案要慢。对于1000万条线路,%time sum(1 for row in open("df_data_raw.csv")) 成本为4.91s,而%time len(open("df_data_raw.csv").readlines())成本为14.6s。
赵鹏举

10

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

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


6

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


6

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

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


第一个是计算文件中的行数。如果您的csv在字符串中有换行符,则不会显示准确的结果
Danilo SouzaMorães18年

3
numline = len(file_read.readlines())

2
file_read显然是一个csv.reader()对象,因此它不具有一个readlines()方法。.readlines()必须创建一个可能很大的列表,然后将其再次丢弃。
马丁·彼得

1
当我写这个答案时,主题没有有关csv的信息是csv阅读器对象。
Alex Troush

3

当实例化一个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)

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

2

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

然后,您可以计数,跳过,变异,直到您的内心渴望:

list(fileObject) #list values

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

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

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)

1

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

sed -n '$=' filename 要么 wc -l filename


如果双引号内有换行符怎么办?仍应将其视为同一记录的一部分。这个答案是错误的
Danilo SouzaMorães18年

1

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

import os

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

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

numOfLines = numOfLines - 1

1

我认为我们可以改善最佳答案,我正在使用:

len = sum(1 for _ in reader)

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.