计算CSV Python中有多少行?

时间:2013-04-19 15:48:02

标签: python csv count

我正在使用python(Django Framework)来读取CSV文件。如您所见,我只从这个CSV中拉出2行。我一直试图做的是在变量中存储CSV的总行数。

如何获取总行数?

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

我试过了:

len(fileObject)
fileObject.length

18 个答案:

答案 0 :(得分:135)

您需要计算行数:

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

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

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

答案 1 :(得分:44)

2018-10-29 EDIT

感谢您的评论。

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

defusedxml==0.4.1
dj-database-url==0.4.1
Django==1.9.5
django-address==0.1.5
django-allauth==0.25.2
django-conversation==1.4.6
django-libs==1.67.4
django-oauth==1.1
django-staticfiles==1.2.1
django-widget-tweaks==1.4.1
gunicorn==19.4.5
oauthlib==1.1.1
Pillow==3.2.0
PyJWT==1.4.0
python-social-auth==0.2.19
python3-openid==3.0.10
requests==2.10.0
requests-oauthlib==0.6.1
six==1.10.0
whitenoise==3.0
psycopg2==2.5.4

以下是测试的代码。

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())为30.2MB,有3100万个字符。

答案 2 :(得分:12)

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

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

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:6)

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

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

numline = len(file_read.readlines())

答案 7 :(得分:2)

首先,你必须打开

打开文件
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的列表时,它会读取所有文件,并且文件中的指针会更改其位置

答案 8 :(得分:2)

使用" list"以适应更实际的对象。

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

list(fileObject) #list values

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

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

答案 9 :(得分:1)

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

      Qualtrics.SurveyEngine.addOnload(function()
        {
          /*Place Your JavaScript Here*/

    var count=document.getElementsByClassName("q-checkbox").length;
    for(var i=0;i<count;i++)
    {

        document.getElementsByClassName("q-checkbox")[i].parentNode.addEventListener("click",hideFunc);
    }



    function hideFunc()
    {

        console.log(this.className);


        if(this.classList.contains("checkers"))

        {
            //this.classList.toggle("checkers");
        this.previousSibling.previousSibling.previousSibling.firstChild.disabled="false";
        this.classList.add("checkers");
        return; 


        }
        else
        if(!(this.classList.contains("checkers")))
        {   

        this.previousSibling.previousSibling.previousSibling.firstChild.disabled="true";
         this.classList.remove("checkers");
            return;
        }




    }

});

如果csv文件包含字段行,您可以从上面的import os numOfLines = int(os.popen('wc -l < file.csv').read()[:-1]) 中扣除一个:

numOfLines

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

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

答案 13 :(得分:0)

尝试

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

在输出中,您会看到类似(aa,bb)的信息,其中aa是行数

答案 14 :(得分:0)

我认为我们可以改善最佳答案,

len = sum(1 for _ in reader)

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

答案 15 :(得分:0)

import pandas as pd
data = pd.read_csv('data.csv') 
totalInstances=len(data)

答案 16 :(得分:0)

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

cat FILE_NAME.CSV | wc -l

从 Jupyter Notebook 或 iPython,您可以将其与 ! 一起使用:

! cat FILE_NAME.CSV | wc -l

答案 17 :(得分: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)
相关问题