Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

如何快速获取文件行数

17 views
Skip to first unread message

对自己好点

unread,
Apr 2, 2014, 11:12:33 PM4/2/14
to
大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行数?
而且在window上,无法调用 wc -l 命令。

网上找了一个方法:

def linecount_3(filename):
linecount = 0
f = open(filename, 'r')
while True:
chunk = f.read(65535)
if not chunk:
break
linecount += chunk.count('\n')
return linecount

但是这种方法好像也挺慢的。
--

[m [31m※ 来源:·水木社区 http://newsmth.net·[FROM: 218.240.53.*] [m

肥了,又肥了 >>>_<<<

unread,
Apr 2, 2014, 11:14:38 PM4/2/14
to
下载一个 GNUwin32 的 coreutils,就有 wc 了。
【 在 RedAngry (对自己好点) 的大作中提到: 】
: 大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行数?
: 而且在window上,无法调用 wc -l 命令。
: 网上找了一个方法:
: ...................

--
世界上有 10 种人:懂 10 进制的和不懂 10 进制的。


[36m※ 修改:·milksea 于 Apr 3 11:14:37 2014 修改本文·[FROM: 124.205.77.*] [m
[m [1;35m※ 来源:·水木社区 newsmth.net·[FROM: 124.205.77.*] [m

对自己好点

unread,
Apr 2, 2014, 11:16:49 PM4/2/14
to
麻烦,机器上不能乱装东西。我的方法是否比 len(open(file).readlines()) 要快点?

【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 下载一个 GNUwin32 的 coreutils,就有 wc 了。

普洛米·我们的民族从来不缺乏苦难

unread,
Apr 2, 2014, 11:34:37 PM4/2/14
to
纯python的话,可以用最笨的办法:

with open(filename) as fr:
for i, _ in enumerate(fr):
pass
print(i+1)

【 在 RedAngry (对自己好点) 的大作中提到: 】
: 大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行
数?
: 而且在window上,无法调用 wc -l 命令。
: 网上找了一个方法:
: ...................
[36m※ 修改:·pulo 于 Apr 3 11:34:36 2014 修改本文·[FROM: 98.207.104.*] [m
[m [36m※ 来源:·水木社区 http://newsmth.net·[FROM: 98.207.104.*] [m

闭关修炼

unread,
Apr 2, 2014, 11:58:56 PM4/2/14
to
with open(filename) as fn:
print len(fn.readlines())

【 在 pulo (普洛米·我们的民族从来不缺乏苦难) 的大作中提到: 】
: 纯python的话,可以用最笨的办法:
: with open(filename) as fr:
: for i, _ in enumerate(fr):
: ...................

--

[m [1;32m※ 来源:·水木社区 newsmth.net·[FROM: 211.99.222.*] [m

普洛米·我们的民族从来不缺乏苦难

unread,
Apr 3, 2014, 12:35:58 AM4/3/14
to
1TB的文件你也要全部一次读进内存?

【 在 structure (闭关修炼) 的大作中提到: 】
: with open(filename) as fn:
: print len(fn.readlines())

--

[m [37m※ 来源:·水木社区 http://newsmth.net·[FROM: 98.207.104.*] [m

对自己好点

unread,
Apr 3, 2014, 2:02:38 AM4/3/14
to
多谢大家的回复,我把我贴的那个函数每次binary读的量改为4M,这样能大大加快速度。65535byte读起来要更多循环,如果设太大了,文件IO本身需要多次读。

【 在 RedAngry (对自己好点) 的大作中提到: 】
: 大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行数?
: 而且在window上,无法调用 wc -l 命令。
: 网上找了一个方法:
: ...................

--

[m [31m※ 来源:·水木社区 http://newsmth.net·[FROM: 218.240.53.*] [m

喝了咖啡就话多-_-;

unread,
Apr 3, 2014, 4:56:43 AM4/3/14
to
下载一个wc.exe放到目录里调用最方便了,绿色的不用安装。
wc是标准化的程序,又速度又稳定,最重要的大家都懂。
自己写的代码以后都会成为维护的负担的。

【 在 RedAngry (对自己好点) 的大作中提到: 】
: 大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行数?
: 而且在window上,无法调用 wc -l 命令。
: 网上找了一个方法:
: ...................

--
Can't go back to where I used to be.


[m [1;34m※ 来源:·水木社区 newsmth.net·[FROM: 140.206.240.*] [m

IvanLee

unread,
Apr 3, 2014, 10:27:59 AM4/3/14
to
这个方法应该是比较好的,另外你可以用多线程来加速了。


【 在 pulo 的大作中提到: 】
: 纯python的话,可以用最笨的办法:
: with open(filename) as fr:
: for i, _ in enumerate(fr):
: ...................

--

[m [33m※ 来源:·水木社区 http://www.newsmth.net·[FROM: 101.6.99.*] [m

普洛米·我们的民族从来不缺乏苦难

unread,
Apr 3, 2014, 4:50:24 PM4/3/14
to


Python把文本文件封装成行迭代器,内部是经过 TextIOWrapper封装
BufferedReader封装FileIO 这样一个过程(跟Java的FileReader和
BufferedReader封装一个道理),层层封装肯定有性能代价,光数行数肯定是在
BufferedReader层操作要比在上层要快,但代码的可读性和可维护性不如写上层代码
好。就是一个简单的权衡。

http://lucumr.pocoo.org/2013/2/13/moar-classes/



【 在 RedAngry (对自己好点) 的大作中提到: 】
: 多谢大家的回复,我把我贴的那个函数每次binary读的量改为4M,这样能大大加快速
度。65535byte读起来要更多循环,如果设太大了,文件IO本身需要多次读。

--

[m [31m※ 来源:·水木社区 http://newsmth.net·[FROM: 98.207.104.*] [m

end of life

unread,
Apr 3, 2014, 7:16:52 PM4/3/14
to
http://stackoverflow.com/questions/845058/how-to-get-line-count-cheaply-in-python
【 在 RedAngry (对自己好点) 的大作中提到: 】
: 大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行数?
: 而且在window上,无法调用 wc -l 命令。
: 网上找了一个方法:
: ...................

--
在生命的最后,我终于放下了一切,静静的等待着死亡的来临


[m [1;36m※ 来源:·水木社区 newsmth.net·[FROM: 211.99.222.*] [m

高开道

unread,
Apr 3, 2014, 8:36:42 PM4/3/14
to
用异步IO应该最快,第一个buffer读入一块文件内容,另一个buffer用异步io请求接下来的块,
这样处理和IO就可以同时进行,计算的时间会被IO的时间掩盖!

【 在 RedAngry 的大作中提到: 】
: 大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行数?
: 而且在window上,无法调用 wc -l 命令。
: 网上找了一个方法:
: ...................

--

[m [34m※ 来源:·水木社区 http://www.newsmth.net·[FROM: 119.161.235.*] [m

出来混,迟早是要还的!

unread,
Apr 3, 2014, 10:44:37 PM4/3/14
to
这个讨论得很充分了,赞!


【 在 eol (end of life) 的大作中提到: 】
: http://stackoverflow.com/questions/845058/how-to-get-line-count-cheaply-in-python


--
陋室空堂,当年笏满床;衰草枯杨,曾为歌舞场。蛛丝儿结满雕梁,绿纱今又糊在蓬窗上。
说什么脂正浓、粉正香,如何两鬃又成霜?昨日黄土垅头送白骨,今宵红绡帐底卧鸳鸯。
金满箱,银满箱,转眼乞丐人皆谤。正叹他人命不长,哪知自己归来丧!
训有方,保不定日后做强梁;择膏粱,谁承望流落在烟花巷!
因嫌纱帽小,致使锁枷扛;昨怜破袄寒,今嫌紫蟒长。
乱烘烘你方唱罢我登场,反认他乡是故乡。甚荒唐,到头来都是为他人做嫁衣裳。


[m [1;37m※ 来源:·水木社区 newsmth.net·[FROM: 222.65.123.*] [m

nothing

unread,
Apr 4, 2014, 3:48:48 AM4/4/14
to
io效率问题,给你一个参考:
http://rabexc.org/posts/io-performance-in-python
【 在 RedAngry 的大作中提到: 】
: 大概有300多个文件,每个300M的文本文件,如何快速用python统计这些文件的总行数?
: 而且在window上,无法调用 wc -l 命令。
: 网上找了一个方法:
: ...................

--
小王子所访问的下一个星球上住着一个酒鬼。访问时间非常短,可是它却使小王子非常忧伤。
  “你在干什么?”小王子问酒鬼,这个酒鬼默默地坐在那里,面前有一堆酒瓶子,有的装着酒,有的是空的。
  “我喝酒。”他阴沉忧郁地回答道。
  “你为什么喝酒?”小王子问道。
  “为了忘却。”酒鬼回答。
  小王子已经有些可怜酒鬼。他问道:“忘却什么呢?”


[m [31m※ 来源:·水木社区 http://www.newsmth.net·[FROM: 220.181.38.*] [m
0 new messages