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 import自定义模块方法
Feb 12 Python
深入解析Python中的WSGI接口
May 11 Python
Python用threading实现多线程详解
Feb 03 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
flask中的wtforms使用方法
Jul 21 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
python多线程下信号处理程序示例
May 31 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 Python
20行代码教你用python给证件照换底色的方法示例
Feb 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
搜索引擎技术核心揭密
2006/10/09 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
JavaScript 面向对象之命名空间
2010/05/04 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
用Python解数独的方法示例
2019/10/24 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
生产部岗位职责范文
2014/02/07 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python