打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python 统计文件的行数

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

需要统计一个文件的行数.

1: 

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

count = len(open(filepath,'rU').readlines())

如果是非常大的文件,上面的方法可能很慢,甚至失效.

2

此时,可以使用循环来处理:

count = -1

for count, line in enumerate(open(thefilepath, 'rU')):

    pass

count += 1

3:

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

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

count = 0

thefile = open(thefilepath, 'rb')

while True:

    buffer = thefile.read(8192*1024)

    if not buffer:

        break

    count += buffer.count('\n')

thefile.close( )

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

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

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

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

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

[situ@tioni nuc]$ wc nuc

231581 2312730 18508908 nuc

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

import time

def timeo(fun, n=10):

    start = time.clock( )

    for i in xrange(n): fun( )

    stend = time.clock( )

    thetime = stend-start

    return fun._ _name_ _, thetime

import os

def linecount_w( ):

    return int(os.popen('wc -l nuc').read( ).split( )[0])

def linecount_1( ):

    return len(open('nuc').readlines( ))

def linecount_2( ):

    count = -1

    for count, line in enumerate(open('nuc')): pass

    return count+1

def linecount_3( ):

    count = 0

    thefile = open('nuc', 'rb')

    while True:

        buffer = thefile.read(65536)

        if not buffer: break

        count += buffer.count('\n')

    return count

for f in linecount_w, linecount_1, linecount_2, linecount_3:

    print f._ _name_ _, f( )

for f in linecount_1, linecount_2, linecount_3:

    print "%s: %.2f"%timeo(f)

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

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

linecount_w 231581

linecount_1 231581

linecount_2 231581

linecount_3 231581

linecount_1: 4.84

linecount_2: 4.54

linecount_3: 5.02

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

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


4:

import os 

temp = os.popen("wc -l " + file_name).read().split()[0)

int(temp) 即为 file_name的行数----------------------------------推荐用这个进行文件的个数,    快额

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
拒绝降权!教你用 Python 确保制作的短视频独一无二
用struts上传多个文件的方法
《自拍教程78》Python 百度网盘500个文件分割
围观大神是如何用 Python 处理文件的?
Python编程新手须知:避免代码陷阱的秘诀
python中的open函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服