如何利用Python快速统计文本的行数

作者:灵剑 时间:2021-11-15 19:48:12 

通常我们会用wc -l来统计文件行数,不过用Python统计也很简单。

要快速统计一个文本文件中的行数,其实就是要统计这个文本文件中换行符的个数。为了尽量提高速度,我们需要尽量多读一些文本然后一起处理。统计换行符的个数可以用bytes内置的count方法。

代码如下:


from __future__ import print_function
import time

if __name__ == '__main__':
   import sys
   start = time.time()
   with open(sys.argv[1],'rb') as f:
       count = 0
       last_data = '\n'
       while True:
           data = f.read(0x400000)
           if not data:
               break
           count += data.count(b'\n')
           last_data = data
       if last_data[-1:] != b'\n':
           count += 1 # Remove this if a wc-like count is needed
   end = time.time()
   print(count)
   print((end-start) * 1000)

上面的代码中,我们将文件尾没有换行符的不完整的部分也算作一行,这跟wc -l略有区别,如果要跟wc -l一致的话,可以将带注释的行删掉。

这里没有处理universal newline、忽略空行等逻辑,如果需要这些功能,程序会变得复杂一些。

使用三个文本文件进行测试,分别有一千万行、一亿六千万行、六亿四千万行。先用wc -l运行两次,然后用Python的wc.py。

运行结果:


[root@yz- test]# docker run -it --rm -v `pwd`:/opt/workspace python:3 bash -c "cd /opt/workspace && time wc -l text.txt && time wc -l text.txt && time python3 wc.py text.txt"
10000000 text.txt

real    0m0.086s
user    0m0.072s
sys     0m0.013s
10000000 text.txt

real    0m0.080s
user    0m0.060s
sys     0m0.019s
10000000
64.38159942626953

real    0m0.150s
user    0m0.100s
sys     0m0.033s
[root@yz- test]# docker run -it --rm -v `pwd`:/opt/workspace python:3 bash -c "cd /opt/workspace && time wc -l text3.txt && time wc -l text3.txt && time python3 wc.py text3.txt"
160000000 text3.txt

real    0m1.322s
user    0m0.991s
sys     0m0.318s
160000000 text3.txt

real    0m1.313s
user    0m0.966s
sys     0m0.341s
160000000
838.7012481689453

real    0m0.908s
user    0m0.595s
sys     0m0.297s
[root@yz- test]# docker run -it --rm -v `pwd`:/opt/workspace python:3 bash -c "cd /opt/workspace && time wc -l text4.txt && time wc -l text4.txt && time python3 wc.py text4.txt"
640000000 text4.txt

real    0m5.805s
user    0m4.349s
sys     0m1.455s
640000000 text4.txt

real    0m5.787s
user    0m4.342s
sys     0m1.445s
640000000
3323.5926628112793

real    0m3.399s
user    0m2.255s
sys     0m1.108s

可以看到Python实际上是比wc -l更快的,主要因为纯Python的步骤很少,大部分时间都在read(),count()这样的C实现的过程中。wc更慢的原因猜想可能是默认的缓冲区更小,所以需要更多的read()

来源:https://zhuanlan.zhihu.com/p/33672466

标签:Python,统计,文本,行数
0
投稿

猜你喜欢

  • python select.select模块通信全过程解析

    2022-05-23 13:13:10
  • python实现二维插值的三维显示

    2022-05-28 14:17:58
  • PyCharm代码回滚,恢复历史版本的解决方法

    2021-01-08 21:19:55
  • mysql 5.6.23 安装配置环境变量教程

    2024-01-19 11:58:14
  • Python requests HTTP验证登录实现流程

    2021-02-27 16:43:04
  • ASP+ajax注册即时提示程序代码

    2011-02-05 11:25:00
  • python scipy.misc.imsave()函数的用法说明

    2022-11-01 13:04:24
  • 2010 图标设计趋势

    2010-12-17 12:44:00
  • Python计算字符宽度的方法

    2021-02-13 20:25:28
  • vue实现图片懒加载的方法分析

    2024-04-27 16:10:29
  • 利用python模拟实现POST请求提交图片的方法

    2021-02-20 05:58:21
  • delete误删数据使用SCN号恢复(推荐)

    2024-01-24 04:02:04
  • python中unittest框架应用详解

    2023-05-26 14:27:42
  • Python Pandas中布尔索引的用法详解

    2023-11-04 08:37:45
  • Sublime Text v4.0(4143)安装方法

    2023-09-27 12:04:50
  • Python中常用操作字符串的函数与方法总结

    2023-07-25 12:09:23
  • Python动态配置管理Dynaconf的实现示例详解

    2021-01-24 19:35:06
  • Python根据区号生成手机号码的方法

    2022-02-20 21:58:29
  • 显示日期格式的几个函数

    2008-09-03 13:20:00
  • js实现限定范围拖拽的示例

    2024-04-29 13:38:55
  • asp之家 网络编程 m.aspxhome.com