python读取txt文件_3分钟学会,用Python如何正确读取大文件?

09d5a6aa722ba273fe8a4ae280b1c5ee.png

文件读写属于一种常见的IO操作,由于操作系统将底层操作磁盘的接口向上封装为一种通用接口,因此Python中读写文件的基本方法和JAVA、PHP等高级编程语言一样,先请求操作系统打开一个文件描述符,通过操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个文件中,最后当文件读写操作完成后关闭文件。

需要注意的是文件读写完成后必须及时关闭文件,一方面打开的文件会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限制的,比如Linux操作系统中我们可以使用ulimit -n命令查看最多可打开文件的数量。另一方面在写文件时,操作系统是把数据放到内存缓冲区异步写入磁盘中,并不会立刻把数据全部写入磁盘,而调用close()方法可以使操作系统把没有写入磁盘的数据全部写入磁盘中,防止数据丢失的情况。接下来我们先看下正确的文件打开方式。

文件打开的几种方式

Python内置了open()方法打开了一个文件,如下所示。文件打开模式有'r'、'w'、'a'、'r+'、'w+'、'a+'、'b'等,'r'只读模式打开文件,并将文件指针指向文件头,如果文件不存在会报错;'w'只写模式打开文件,并将文件指针指向文件头,如果文件存在则将其内容清空,不存在则创建;'a'以只追加可写模式打开文件,并将文件指针指向文件尾部,如果文件不存在则创建。对应于open()方法打开文件需要有close()方法关闭文件。

f = open('/mnt/media/log.txt', 'r')f.read()f.close()

由于读写文件时都有可能产生IOError,比如文件不存在的情况,此时open()方法会抛出一个IOError的异常,那么后面的f.close()就不会被调用。为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现。

try: f = open('/mnt/media/log.txt', 'r') f.read()finally: if f: f.close()

由于try ... finally方式实现较为繁琐,Python引入了with语句会自动调用f.close()方法,使得代码更简洁。

with open('/mnt/media/log.txt', 'r') as f: f.read()

大文件读取几种方式

对文件的读取操作是将文件中的数据加载到内存中,那么对于大文件的读取,如果一次把文件中全部的内容全部加载到内存中显然会耗尽系统的内容。我们看下Python中读取文件常用的方法read()、readline()、readlines()对于大文件读取的支持情况:read(size)方法是从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,如果文件比较小,用read()一次读取文件较为方便,但如果不能确定文件大小,反复调用read(size)比较保险;readline()方法每次读出一行内容,所以读取时占用内存小,比较适合大文件。readlines()方法读取整个文件所有行,保存在一个列表list变量中,每行作为一个元素,读取大文件时比较占内存。

说到大文件的读取,有个linecache模块,这里要说明下的是这个模块的优势是通过缓存文件内容的方式来加快下次读取文件的速度,所以需要耗费更多的内存,那么以下是我在Linux发行版LEDE+MT7688的环境下对readlines、linecache.getlines以及遍历文件这三种方式在内存的使用情况下的对比:

count = len(open(filepath, 'r').readlines())_________________________________________________________count = = len(linecache.getline(filepath) )_________________________________________________________count = 0for count, line in enumerate(open(filepath,'r')): passcount += 1________________________________________________count = len([ "" for line in open("filename
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值