3分钟学会,用Python如何正确读取大文件?
off999 2024-10-10 07:52 26 浏览 0 评论
文件读写属于一种常见的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 = 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
觉得文章还可以的话不妨收藏起来慢慢看,有任何意见或者看法欢迎大家评论!
我是一名python开发工程师,整理了一套python的学习资料,如果你想提升自己,对编程感兴趣,关注我并在后台私信小编:“08”即可免费领取资料!希望对你能有所帮助!
相关推荐
- Python Flask 容器化应用链路可观测
-
简介Flask是一个基于Python的轻量级Web应用框架,因其简洁灵活而被称为“微框架”。它提供了Web开发所需的核心功能,如请求处理、路由管理等,但不会强制开发者使用特定的工具或库。...
- Python GUI应用开发快速入门(python开发软件教程)
-
一、GUI开发基础1.主流GUI框架对比表1PythonGUI框架比较框架特点适用场景学习曲线Tkinter内置库,简单小型应用,快速原型平缓PyQt功能强大,商用许可专业级桌面应用陡峭PySi...
- 实战揭秘:Python Toga 打造跨平台 GUI 应用的神奇之旅
-
在Python的世界里,GUI(图形用户界面)开发工具众多,但要找到一款真正跨平台、易于使用且功能强大的工具并不容易。今天,我们就来深入探讨一下Toga——一款Python原生、操作系统原...
- python应用目录规划(python的目录)
-
Python大型应用目录结构规划(企业级最佳实践)核心原则模块化:按业务功能拆分,高内聚低耦合可扩展性:支持插件机制和动态加载环境隔离:清晰区分开发/测试/生产环境自动化:内置标准化的构建测试部署流...
- Python图形化应用开发框架:PyQt开发简介
-
PyQt概述定义:PyQt是Python绑定Qt框架的工具集,用于开发跨平台GUI应用程序原理:通过Qt的C++库提供底层功能,PyQt使用SIP工具生成Python绑定特点:支持Windows/ma...
- [python] 基于PyOD库实现数据异常检测
-
PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型...
- Python、Selenium 和 Allure 进行 UI 自动化测试的简单示例脚本
-
环境准备确保你已经安装了以下库:SeleniumAllurepytest你可以使用以下命令安装所需库:pipinstallseleniumallure-pytestpytest示例代码下面的代...
- LabVIEW 与 Python 融合:打造强大测试系统的利器
-
在现代测试系统开发领域,LabVIEW和Python各自凭借独特优势占据重要地位。LabVIEW以图形化编程、仪器控制和实时系统开发能力见长;Python则凭借丰富的库资源、简洁语法和强大数...
- 软件测试进阶之自动化测试——python+appium实例
-
扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...
- Python openpyxl:读写样式Excel一条龙,测试报表必备!
-
无论你是测试工程师、数据分析师,还是想批量导出Excel的自动化工作者,只需一个库openpyxl,即可高效搞定Excel的各种需求!为什么选择openpyxl?支持.xlsx格式...
- Python + Pytest 测试框架——数据驱动
-
引言前面已经和大家介绍过Unittest测试框架的数据驱动框架DDT,以及其实现原理。今天和大家分享的是Pytest测试框架的数据驱动,Pytest测试框架的数据驱动是由pytest自...
- 这款开源测试神器,圆了我玩游戏不用动手的梦想
-
作者:HelloGitHub-Anthony一天我在公司用手机看游戏直播,同事问我在玩什么游戏?我和他说在看直播,他恍然大悟:原来如此,我还纳闷你玩游戏,咋不用动手呢。。。。一语惊醒梦中人:玩游戏不用...
- Python单元测试框架对比(pycharm 单元测试)
-
一、核心框架对比特性unittest(标准库)pytest(主流第三方)nose2(unittest扩展)doctest(文档测试)安装Python标准库pipinstallpytestp...
- 利用机器学习,进行人体33个2D姿态检测与评估
-
前几期的文章,我们分享了人脸468点检测与人手28点检测的代码实现过程,本期我们进行人体姿态的检测与评估通过视频进行人体姿势估计在各种应用中起着至关重要的作用,例如量化体育锻炼,手语识别和全身手势控制...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Python Flask 容器化应用链路可观测
- Python GUI应用开发快速入门(python开发软件教程)
- 【MCP实战】Python构建MCP应用全攻略:从入门到实战!
- 实战揭秘:Python Toga 打造跨平台 GUI 应用的神奇之旅
- python应用目录规划(python的目录)
- Python图形化应用开发框架:PyQt开发简介
- [python] 基于PyOD库实现数据异常检测
- Python、Selenium 和 Allure 进行 UI 自动化测试的简单示例脚本
- LabVIEW 与 Python 融合:打造强大测试系统的利器
- 软件测试进阶之自动化测试——python+appium实例
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)