文件读写属于一种常见的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以及遍历文件这三种方式在内存的使用情况下的对比:

在学习过程中有什么不懂得可以加我的

python学习交流扣扣qun,784-758-214

群里有不错的学习视频教程、开发工具与电子书籍。

与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容

count = len(open(filepath, 'r').readlines())

_________________________________________________________

count = = len(linecache.getline(filepath) )

_________________________________________________________

count = 0

for count, line in enumerate(open(filepath,'r')):

pass

count += 1

________________________________________________

count = len([ "" for line in open("filename","r")])

不打开文件:Mem: 37648K used, 88184K free, 116K shrd, 0K buff, 12540K cached

readlines读取文件:Mem: 69560K used, 56272K free, 124K shrd, 0K buff, 27004K cached

linecache.getlines读取文件:Mem: 70396K used, 55436K free, 116K shrd, 0K buff, 26996K cached

遍历方式读取文件:Mem: 53032K used, 72800K free, 116K shrd, 0K buff, 27668K cached

但是linecache.getlines在读取文件的速度上是有绝对优势的,因为文件内容已经缓存在内存中了,下次读取可以直接从内存中获取,可以使用linecache.checkcache检测文件在磁盘上是否发生了变化,如果变化了需要使用linecache.updatecache更新缓存。不过首次读取文件需要打开文件,对于一个15M左右20000行的日志文件三种方式差不多需要8、9秒的时间,但第二次读取文件linecache.getlines方式是微秒级的。

readlines读取文件:

time count 215794 type1 is 9.58759188652

time count 215794 type1 is 1.70862102509

time count 215794 type1 is 2.05462002754

time count 215794 type1 is 1.69754505157

time count 215813 type1 is 2.1633579731

time count 215813 type1 is 1.61879992485

遍历方式读取文件:

time count 215508 type2 is 8.8404238224

time count 215508 type3 is 2.22844409943

time count 215508 type2 is 2.19772100449

time count 215508 type3 is 2.57516384125

time count 215586 type2 is 2.12095785141

time count 215586 type3 is 2.55960321426

time count 215586 type2 is 2.1704659462

time count 215586 type3 is 2.11596107483

linecache.getlines读取文件:

time count 214811 type4 is 8.19337201118

time count 214811 type4 is 6.50882720947e-05

time count 214811 type4 is 9.41753387451e-05

time count 214811 type4 is 6.69956207275e-05

time count 214811 type4 is 9.41753387451e-05

time count 214811 type4 is 6.89029693604e-05

觉得文章还可以的话不妨收藏起来慢慢看,有任何意见或者看法欢迎大家评论!

3分钟学会python_3分钟学会,学会用Python正确读取大文件相关推荐

  1. 3分钟学会python_3分钟学会一个Python小技巧

    Python时间日期转换在开发中是非常高频的一个操作,你经常会遇到需要将字符串转换成 datetime 或者是反过来将 datetime 转换成字符串. datetime 分别提供了两个方法 strp ...

  2. 3分钟学会python_3分钟学会使用Python推荐系统库Surprise

    最近做推荐系统,研究了一下Surprise库,使用简单,效果不错. Github地址:NicolasHug/Surprise 实现功能: 找到和用户A相似的N个用户 找到和项目A相似的N个项目 1.i ...

  3. 3分钟入门python_3分钟学完Python,直接从入门到精通「史上最强干货库」

    作为帅气小编,我已经把python一些模块的甩在这儿了qwq,只要你拿到这些干货,包你玩转python,直接冲向"大佬"的段位,如果已经学了C或者C++或者说如果你需要你的一段关键 ...

  4. 3分钟入门python_3分钟带你了解世界第一语言Python 入门上手也这么简单!

    一.Python入门 1. Python爬虫入门一之综述 Python爬虫入门二之爬虫基础了解 Python爬虫入门三之Urllib库的基本使用 Python爬虫入门四之Urllib库的高级用法 Py ...

  5. 如何查询手机是不是翻新机?2分钟看懂教程,学会可自查爱机

    如何查询手机是不是翻新机?2分钟看懂教程,学会可自查爱机 大家或许会有疑问这年头还会有人翻新华为手机?其实有些事情只是我们不知道而已,随着一些黑心商贩的存在,不少翻新版华为出现在我们的市场上,那么我们 ...

  6. 学会爱,也学会批处理

    这是一篇技术教程,我会用很简单的文字表达清楚自己的意思,你要你识字就能看懂,就能学到知识.写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可以让事情变的更简单,那么就让它简单吧!看这篇 ...

  7. 计算机研讨会通讯录,江苏学会网 中国力学学会学术大会’2005 第二轮通知

    中国力学学会学术大会'2005将于2005年8月25-28日在北京召开,会议由中国力学学会.北京工业大学主办,协办单位有(按音序排列): 北京大学 北京航空航天大学 北京交通大学 北京理工大学 长沙理 ...

  8. 我原本以为学会Excel走天下,想不到Python这么牛?

    在家办公的那段日子,原以为是快乐摸鱼的开始,可是问了一圈身边的朋友,基本都处于"007"的状态.好多次明明已经合上电脑了,微信上来个需求就得立马处理. 复工之后,也依然不能准时下班 ...

  9. python打开鼠标指定文件夹_学会python文件操作,鼠标好像没用了,学习python第10天...

    电影是人类对未来的向往,在<黑客帝国>中,我们看到了一个数字化的社会,而当你学会python文件操作,你也就离你向往的黑客近一点了,用程序来直接影响电脑上的其他文件,只需要几行代码就搞定. ...

  10. 微信文件过大不能上传?学会这几种方法,再大文件也能轻松发

    微信文件过大不能上传?学会这几种方法,再大文件也能轻松发 微信已经逐渐成为办公必须,但微信不支持大文件的发送,那么遇到这种情况,很多小伙伴都会选择用QQ,其实微信也能发送大文件,只要方法用对,下面就来 ...

最新文章

  1. Java中AudioFileStream_AudioFileStream学习
  2. AutoHotKey Script AHK脚本++Topre Realforce 104Pro十周年纪念版静电容键盘
  3. Lesson 16.6Lesson 16.6 复现经典架构:LeNet5 复现经典架构 (2):AlexNet
  4. 内存条能4+8混插吗?_笔记本内存条双通道提升有多大?实测FORESEE,你知道好处在哪吗...
  5. real time linux pdf,【整理】ubuntu real time Linux
  6. 稀疏矩阵建立十字链表c语言,实验6-稀疏矩阵十字链表的存储.doc
  7. 反射 数据类型_C#扫盲篇(一):反射机制情真意切的说
  8. [转]80后偷偷“老了”的八大表现
  9. ASP.NET Web开发框架之八 所有ERP部分的源代码全部开放下载
  10. python获取快手无水印demo
  11. 物联网15年,盘点国内崛起的智能产业
  12. 2021包膜机十大品牌排行榜
  13. 一文了解上拉电阻和下拉电阻(二)
  14. 项目经理修炼之道(1) -- 给软件开发建模 .
  15. 轮播图进度条同步切换(参考漫威官网)
  16. C语言——PTA 用格里高利公式求给定精度的PI值
  17. 小白学python.1
  18. 文旅行业大数据舆情监控方案
  19. 电子沙盘系统android,电子沙盘指挥系统功能介绍
  20. goland防止sql注入的方法

热门文章

  1. 二分图——匈牙利算法——的学习
  2. ld 命令看内存布局 汇编级调试
  3. 是时候了,我们需要前端架构师
  4. PX4 vision_to_mavros定位
  5. 计算机 外存储能直接被cpu处理??,cpu可直接处理外存上的信息吗?_常见问题解析...
  6. 游戏开发之C++类中的static、const梳理总结(C++基础)
  7. Cocos2d-xUI组件详解
  8. OSPF报文分类与格式
  9. MySQL主从同步(四)——M-M架构配置实战
  10. QoS中流量监管和流量整形详解