首页 » 网站推广 » mt7688php技巧_3分钟学会用Python若何精确读取大年夜文件

mt7688php技巧_3分钟学会用Python若何精确读取大年夜文件

访客 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

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

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

mt7688php技巧_3分钟学会用Python若何精确读取大年夜文件

文件打开的几种办法

mt7688php技巧_3分钟学会用Python若何精确读取大年夜文件
(图片来自网络侵删)

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\"大众,\"大众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”即可免费领取资料!
希望对你能有所帮助!

标签:

相关文章

php常量率低技巧_PHP 常量详解教程

PHP 常量常量是单个值的标识符(名称)。在脚本中无法改变该值。有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。注释...

网站推广 2024-12-19 阅读0 评论0