我正在使用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行添加到总计中; 已经读取的行不计算在内.
dix*_*hom 51
谢谢你的意见.
我测试了几种代码来获得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)
我希望这有助于每个人.
首先,您必须使用 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来读取记录.
row_count = sum(1 for line in open(filename))
为我工作。
注意:sum(1 for line in csv.reader(filename))
似乎要计算第一行的长度
小智 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
从源迭代器读取的行数。
小警告:
归档时间: |
|
查看次数: |
168327 次 |
最近记录: |