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

新手上路,请多包涵

我正在使用 python(Django 框架)读取 CSV 文件。如您所见,我从这个 CSV 文件中只提取了 2 行。我一直在尝试做的是将 CSV 的总行数存储在一个变量中。

我怎样才能得到总行数?

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

我试过了:

 len(fileObject)
fileObject.length

原文由 GrantU 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 524
2 个回答

您需要计算行数:

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

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

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

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 dixhom 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题