专栏首页python3强悍的 Python —— 读取大文件

强悍的 Python —— 读取大文件

Python 环境下文件的读取问题,请参见拙文 Python 基础 —— 文件

这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件。

1. read() 接口的问题

f = open(filename, 'rb')
f.read()

我们来读取 1 个 nginx 的日至文件,规模为 3Gb 大小。read() 方法执行的操作,是一次性全部读入内存,显然会造成:

MemoryError
...

也即会发生内存溢出。

2. 解决方案:转换接口

  • (1)readlines() :读取全部的行,构成一个 list,实践表明还是会造成内存的问题; for line in f.reanlines(): ...
  • (2)readline():每次读取一行, while True: line = f.readline() if not line: break
  • (3)read(1024):重载,指定每次读取的长度 while True: block = f.read(1024) if not block: break

3. 真正 Pythonic 的方法

真正 Pythonci 的方法,使用 with 结构:

with open(filename, 'rb') as f:
    for line in f:
        <do something with the line>

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

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

Reference

  1. How to read large file, line by line in python

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python06算数运算

    is是看两个标识符是不是引用自一个对象,利用id()函数就可以看的很清楚,id可以理解为得到变量的内存地址 而==是value判断,不同类型不一样,如:

    py3study
  • python 文件内容对比操作

    #-*-coding:utf-8-*- import re f1 = open('d:/test/mail/bounce_list.txt','r') ...

    py3study
  • @staticmethod

    py3study
  • monolog使用解析

    1.channel渠道、通道 可以区分同项目不同模块日志 2.handler处理器 一个channel设置多个handler,是按照堆栈的方式依次调用(后进...

    苦咖啡
  • Python2运行时查看线程信息

    kongxx
  • MySQL基础复习

    2NF:每一个非主属性完全依赖于候选码(属性组的值能唯一的标识一个元组,但是其子集不可以)。

    大眼瞪小眼
  • Java中事务总结详解

    事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性...

    DencyCheng
  • C# 基础知识系列- 6 Lambda表达式和Linq简单介绍

    C#的lambda和Linq可以说是一大亮点,C#的Lambda无处不在,Linq在数据查询上也有着举足轻重的地位。

    程序员小高
  • [Python]将你的module制作成

        python解释器查找module进行加载的时候,查找的目录是存放在sys.path变量中的,sys.path变量中包含文件的当前目录。如果你想使用一个...

    py3study
  • Python(xlrd、xlwt模块)操

    关于Python的xlrd、xlwt模块的使用,推介另一位博客主的博文:https://www.cnblogs.com/zhoujie/p/python18.h...

    py3study

扫码关注云+社区

领取腾讯云代金券