python 统计文件行数_[转贴]Python 统计文件行数

需求:需要统计一个文件的行数

讨论:最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了。

file_path = r'F:\orm模块\a.txt'count=len(open(file_path).readlines())print(count)

如果是非常大的文件,上面的方法可能很慢,甚至失效.此时,可以使用循环来处理:

file_path = r'F:\orm模块\a.txt'count= -1

for count, line in enumerate(open(file_path, 'rU')):passcount+= 1

print(count)

另外一种处理大文件比较快的方法是统计文件中换行符的个数'\n

'(或者包含'\n'的字串,如在windows系统中):

file_path = r'F:\orm模块\a.txt'count=0

file_obj= open(file_path, 'rb')whileTrue:

buffer= file_obj.read(8192 * 1024)if notbuffer:breakcount+= buffer.count(b'\n')print(count+1)

file_obj.close()

参数'rb'是必须的,否则在windows系统上,上面的代码会非常慢.

当 外部系统提供统计行数的方法时,你可以使用它们(通过os.popen),如unix的wc - l.当然,通过自己的程序来完成会更简单,快捷和通用.你可以假设大多数的文本文件都有合理的大小,所以把它们一次读入内存中处理是可行的.对于这样的情 况,len方法返回readlines的大小是最简单的.

加入一个文件的大小大于内存(比如,有好几百M那么大),那个最简单的方法会变得难以忍受的慢,因为操作系统要使用虚拟内存,并不停同过硬盘来换页.也可能出现失败的情况 ,就是虚拟内存不够大.一台有256M内存的机器,当处理一个1G或2G大小的文件的时候,仍然可能出现严重的问题.在这种情况下,使用循环处理是比较好的方式,enumerate保存了函数.

第三种方法的核心思想是统计缓存中回车换行字符的个数.这可能最不容易直接想到的方法,也是最不通用的方法,但它可能是最快的方法.

当然,在大多数情况下,性能并不是最重要的,但如果它是的话,影响性能的部分往往不是我们的直觉告诉我们的地方,所以请千万不要相信自己的直觉, 要考评估和测量来判断.举例说明,对于一个中等大小的unix日志文件,比如一个18M的文本,包含了230,000行:

[situ@tioni nuc]$ wc nuc231581 2312730 18508908 nuc

使用下面的测试文件,bench.py:

importtimefrom pygments.util importxrange

file_path= r'F:\orm模块\a.txt'

def timeo(fun, n=10):

start=time.clock( )for i inxrange(n): fun( )

end_time=time.clock( )

the_time= end_time-startreturn (fun.__name__, the_time)importosdeflinecount_w( ):return int(os.popen('wc -l nuc').read( ).split( )[0])deflinecount_1( ):returnlen(open(file_path).readlines( ))deflinecount_2( ):

count= -1

for count, line in enumerate(open(file_path)): pass

return count+1

deflinecount_3( ):

count=0

the_file= open(file_path, 'rb')whileTrue:

buffer= the_file.read(65536)if not buffer: breakcount+= buffer.count(b'\n')returncountfor f inlinecount_w, linecount_1, linecount_2, linecount_3:print(f.__name__, f( ))for f inlinecount_1, linecount_2, linecount_3:print ("%s: %.2f"%timeo(f))

首先我调用所有的方法来读文件,以确保不会发生异常情况(如果发生的话程序会中止),接下来,在函数timo中,我调用每种方法10次,然后看看结果,这是一个比较旧但比较稳定的机器:

[situ@tioni nuc]$ python -O bench.py

linecount_w231581linecount_1231581linecount_2231581linecount_3231581linecount_1:4.84linecount_2:4.54linecount_3:5.02

可以看出,性能上的差别不是很大,实际上,一般用户不会在意10%左 右的性能差别.另外,最快的方法是用循环处理文件对象,而最慢的方法是统计换行符的个数.在实际中,假如不考虑处理那些好几百M的大文件,我总是会选中第一种最简单的方法.

测量代码的性能是很重要的,Python标准库也提供了timeit来实现这些工作.我建议你使用timeit,而不是像我在本节做的那样,自己写测试代码,我写的代码是好几年前的事情了,现在既然有了timeit,就没有必要再使用它了.

统计压缩文件行数

importzipfile, os

file_path= r'F:\orm模块\day65.zip'z= zipfile.ZipFile(file_path, "r")#打印zip文件中的文件列表

total_line =0

code_line=0

comment_line=0

file_size=0for filename inz.namelist():

content=z.read(filename)if not len(content): continuefile_size+= len(content) #文件大小统计

with open('tmp', 'wb') as f1:

f1.write(content)

with open('tmp', 'rb') as f2:for line inf2:

total_line+= 1 #文件行数统计

if not line.strip(): continue

if line.strip().startswith(b'#'):

comment_line+= 1 #注释行统计

else:

code_line+= 1 #代码行统计

os.remove('tmp')print(total_line)print(code_line)print(comment_line)print(file_size)

来自:http://blog.sina.com.cn/s/blog_48acdd250100qh93.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值