计算CSV Python中有多少行?

Gra*_*ntU 89 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()) 
Run Code Online (Sandbox Code Playgroud)

我试过了:

len(fileObject)
fileObject.length
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 150

您需要计算行数:

row_count = sum(1 for row in fileObject)  # fileObject is your csv.reader
Run Code Online (Sandbox Code Playgroud)

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

如果您已经开始阅读2行,则需要将这2行添加到总计中; 已经读取的行不计算在内.

  • @Escachator:你的文件名有53个字符.阅读器采用可迭代或打开的文件对象,但不是文件名. (4认同)
  • 请注意,如果您想再次遍历读取器(例如,要处理行),则需要重置迭代器,然后重新创建读取器对象:file.seek(0)然后fileObject = csv。读者(文件)` (3认同)
  • 谢谢。这会起作用,但是我必须先阅读这些行吗?这似乎有点受欢迎? (2认同)
  • 您*必须*阅读各行;不能保证行的大小是固定的,因此计数它们的唯一方法是全部读取它们。 (2认同)

dix*_*hom 51

2018-10-29编辑

谢谢你的意见.

我测试了几种代码来获得csv文件中的速度方面的行数.最好的方法如下.

with open(filename) as f:
    sum(1 for line in f)
Run Code Online (Sandbox Code Playgroud)

这是测试的代码.

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)
Run Code Online (Sandbox Code Playgroud)

结果如下.

# 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
Run Code Online (Sandbox Code Playgroud)

总之,sum(1 for line in f)是最快的.但可能没有太大的区别len(f.readlines()).

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


小智 14

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

file = open("Task1.csv")
numline = len(file.readlines())
print (numline)
Run Code Online (Sandbox Code Playgroud)

我希望这有助于每个人.

  • 我喜欢这个简短的答案,但它比 Martijn Pieters 的慢。对于 10M 行, `%time sum(1 for row in open("df_data_raw.csv"))` 花费 4.91 秒,而 `%time len(open("df_data_raw.csv").readlines())` 花费 14.6 秒。 (2认同)

pro*_*tti 8

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

input_file = open("nameOfFile.csv","r+")
Run Code Online (Sandbox Code Playgroud)

然后使用 csv.reader 打开 csv

reader_file = csv.reader(input_file)
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用指令“len”获取行数

value = len(list(reader_file))
Run Code Online (Sandbox Code Playgroud)

总代码是这样的:

input_file = open("nameOfFile.csv","r+")
reader_file = csv.reader(input_file)
value = len(list(reader_file))
Run Code Online (Sandbox Code Playgroud)

记住,如果你想重用csv文件,你必须做一个input_file.fseek(0),因为当你使用reader_file的列表时,它读取所有文件,文件中的指针改变了它的位置


小智 7

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

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


Mit*_*pta 6

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

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

  • 第一个是计算文件中的行数。如果您的 csv 在字符串中有换行符,则不会显示准确的结果 (2认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)

引用官方文档

csvreader.line_num

从源迭代器读取的行数。

小警告:

  • 总行数,包括标题,如果 CSV 有。