Python内存映射文件读写方式


Posted in Python onApril 24, 2020

我就废话不多说了,还是直接看代码吧!

import os
import time
import mmap
 
filename = 'test.txt'
 
#如果不存在,创建。
if not os.path.exists(filename):
 open(filename, 'w')
 
print(os.path.isdir(filename))
if os.path.isfile(filename):
 print(time.ctime(os.path.getctime(filename)))
 
fd = os.open(filename, os.O_RDWR)
m = mmap.mmap(fd, 50, access=mmap.ACCESS_WRITE) # 1024字节的文件。
m.seek(2) 
buf1 = bytes(b'Zhang')
m[2:len(buf1)+2] = buf1
 
buf2 = b'Phil'
 
m.seek(20) # 定位写入的位置。
m.write(buf2) # 写入字节数据。
m.close()
 
fd = os.open(filename, os.O_RDWR)
m = mmap.mmap(fd, 50, access=mmap.ACCESS_READ)
m.seek(20)
buf3 = m.read(len(buf2))
m.close()
print(list(buf3))

操作后的test.txt文件内容:

Zhang Phil

补充知识:Python对二进制文件做内存映射,高效优雅地对内容随机访问

读写二进制文件还在使用open函数?

各种组合seek()、read()和write()累不累?

使用 mmap 模块实现对文件的内存映射,让我们读写二进制文件像操作数组一样高效优雅。

先给出一个实用函数,用来演示如何打开一个文件并对它进行内存映射操作。

def memory_map(filename, access=mmap.ACCESS_WRITE):
 size = os.path.getsize(filename)
 fd = os.open(filename, os.O_RDWR)
 return mmap.mmap(fd, size, access=access)

要使用这个函数,需要先准备一个已经创建好的文件并为之填充一些数据。

>>> size = 1000000
>>> with open('data','wb') as f:
  f.seek(size-1)
  f.write(b'\x00')

接着我们可以使用memory_map()函数对文件内容做内存映射,它返回的mmap对象可以让我们像操作数组一样读写二进制文件!

>>> m = memory_map('data')
>>> len(m)
1000000
>>> m[:10]
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> m[0]
0
>>> m[0:11]=b'Hello World'#改变一个切片
>>> m.close()
>>> with open('data','rb') as f:#验证改变已经生效
 print(f.read(11))
 
b'Hello World'

由于mmap()返回的mmap对象也可以当作上下文管理器使用,在这种情况下,底层的文件会自动关闭。

>>> with memory_map('data') as m:
 print(len(m))
 print(m[0:11])
 
1000000
b'Hello World'

默认情况下memory_map()函数打开的文件既可以读,也可以写。对数据的任何修改都会拷贝回原始的文件中。

如果需要只读访问,可以为access参数提供mmap.ACCESS_READ值。

m = memory_map(filename, mmap.ACCESS_READ)

如果只想要在本地修改数据,并不想将这些修改写回到原始文件中,可以使用mmap.ACCESS_COPY参数。

m = memory_map(filename, mmap.ACCESS_COPY)

总结:

通过mmap将文件映射到内存之后,我们可以高效并优雅地对文件的内容进行随机访问。

与其打开文件后通过组合各种seek()、read()和write()调用来访问,不如简单将文件映射到内存,然后通过切片操作来访问数据。

需要强调的是,对某个文件进行内存映射并不会导致将整个文件读到内存中。也就是说,文件并不会拷贝到某种内存缓冲区或数组上。相反,操作系统只是为文件内容保留一段虚拟内存而已。

当访问文件的不同区域时,文件的这些区域将被读取并按照需要映射到内存区域中。但是,文件中从未访问过的部分会简单地留在磁盘上。这一切都是以透明的方式在幕后完成的。

如果有多个Python解释器对同一个文件做了内存映射,得到的mmap对象可以用来在解释器之间交换数据。也就是说,所有的解释器可以同时读/写数据,在一个解释器中对数据做出的修改会自动反映到其他解释器上。

虽然还需要一些额外的步骤来处理同步问题,但是有时候可以使用这种方法作为通过管道或者socket传输数据的替代方案。

以上这篇Python内存映射文件读写方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
Python中的jquery PyQuery库使用小结
May 13 Python
跟老齐学Python之变量和参数
Oct 10 Python
仅利用30行Python代码来展示X算法
Apr 01 Python
Python编码爬坑指南(必看)
Jun 10 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
Apr 10 Python
Python unittest模块用法实例分析
May 25 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
eclipse创建python项目步骤详解
May 10 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
pandas的resample重采样的使用
Apr 24 #Python
python实现在内存中读写str和二进制数据代码
Apr 24 #Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 #Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 #Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 #Python
python 读取二进制 显示图片案例
Apr 24 #Python
150行python代码实现贪吃蛇游戏
Apr 24 #Python
You might like
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python中self原理实例分析
2015/04/30 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Python数据类型之List列表实例详解
2019/05/08 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
python global和nonlocal用法解析
2020/02/03 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
获奖的大学生创业计划书
2014/01/05 职场文书
关于打架的检讨书
2014/01/17 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
社区服务活动总结
2014/05/07 职场文书
商场租赁意向书
2014/07/30 职场文书
党性教育心得体会
2014/09/03 职场文书
团拜会主持词
2015/07/04 职场文书