python读取大文件

  1. 较pythonic的方法,使用with结构

    • 文件可以自动关闭
    • 异常可以在with块内处理
        with open(filename, 'rb') as f:
    for line in f:
    <do someting with the line>

最大的优点:对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。

There should be one – and preferably only one – obvious way to do it.

  1. 使用生成器generator

如果想对每次迭代读取的内容进行更细粒度的处理,可以使用yield生成器来读取大文件

    def readInChunks(file_obj, chunkSize=2048):
"""
Lazy function to read a file piece by piece.
Default chunk size: 2kB.
"""
while True:
data = file_obj.read(chunkSize)
if not data:
break
yield data
f = open('bigFile')
for chunk in readInChunks(f):
do_something(chunk)
f.close()
  1. linux下使用split命令(将一个文件根据大小或行数平均分成若干个小文件)
    wc -l BLM.txt  # 读出BLM.txt文件一共有多少行
# 利用split进行分割
split -l 2482 ../BLM/BLM.txt -d -a 4 BLM_
# 将 文件 BLM.txt 分成若干个小文件,每个文件2482行(-l 2482),文件前缀为BLM_ ,系数不是字母而是数字(-d),后缀系数为四位数(-a 4) # 按行数分割
split -l 300 large_file.txt new_file_prefix
# 文件大小分割
split -b 10m server.log waynelog # 对文件进行合并:使用重定向,'>' 写入文件 , '>>' 追加到文件中
cat file_prefix* > large_file

在工作中的日常: 用户信息,log日志缓存,等都是大文件

补充:linecache模块

当读取一个文件的时候,python会尝试从缓存中读取文件内容,优化读取速度,提高效率,减少了I/O操作

linecache.getline(filename, lineno) 从文件中读取第几行,注意:包含换行符

linecache.clearcache() 清除现有的文件缓存

linecache.checkcache(filename=None) 检查缓存内容的有效性,可能硬盘内容发生改变,更新了,如果没有参数,将检查缓存中的所有记录(entries)

    import linecache
linecache.getline(linecache.__file__, 8)

题目:

现给一个文件400M(该文件是由/etc/passwd生成的),统计其中root字符串出现的次数

    import time
sum = 0
start = time.time()
with open('file', 'r') as f:
for i in f:
new = i.count('root')
sum+=new
end = time.time()
print(sum, end-start)

:有时候这个程序比c,shell快10倍,原因就是,python会读取cache中的数据,使用缓存在内部进行优化,减少i/o,提高效率

References : How to read a large file

最新文章

  1. SGIP、SMGP 长短信发送问题小结
  2. CDH安装失败了,如何重新安装
  3. Linux LVM学习总结&mdash;&mdash;创建卷组VG
  4. 存储过程中的output跟return区别及实例说明
  5. notepad++和sublime 常用插件及主题
  6. MATLAB元胞数组
  7. C(8)
  8. [python][matlab]使用python调用matlab程序
  9. CentOs查看某个字符串在某个目录下的行数
  10. Git常用的操作记录(自用)
  11. 关于__cmp__的使用
  12. puppet 横向扩展(三)
  13. UML和模式应用4:初始阶段(5)--用例编写的准则
  14. C++ 并发编程,std::unique_lock与std::lock_guard区别示例
  15. CI 数据库操作总结
  16. JS添加标签效果
  17. 关于Unity中的模型描边与Shader切换(专题二)
  18. USB的中断说明
  19. Selenium之Chrome浏览器的启动问题及解决
  20. &lt;&lt;网络是怎样连接的&gt;&gt;笔记第一章browser生成message

热门文章

  1. 微服务实战(三):以MySQL为例,从原理上理解那些所谓的数据库军规
  2. css预处理器(sass)
  3. 个人项目-wordcount
  4. 使用ajax请求后返回数据显示undefinded解决办法
  5. 需求分析之WBS
  6. javascript 字面量
  7. 如何解决ORA-12547错误!
  8. ZT 设计模式六大原则(1):单一职责原则
  9. Access的&quot;是否型&quot;字段与Sql Server的&quot;Bit&quot;字段
  10. 安装Jdk,tomcat【转载】