python标准库基础之mmap:内存映射文件
#作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是text.txt)
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec
egestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo,
a elementum elit tortor eu quam. Duis tincidunt nisi ut ante. Nulla
facilisi. Sed tristique eros eu libero. Pellentesque vel
arcu. Vivamus purus orci, iaculis ac, suscipit sit amet, pulvinar eu,
lacus. Praesent placerat tortor sed nisl. Nunc blandit diam egestas
dui. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Aliquam viverra fringilla
leo. Nulla feugiat augue eleifend nulla. Vivamus mauris. Vivamus sed
mauris in nibh placerat egestas. Suspendisse potenti. Mauris
massa. Ut eget velit auctor tortor blandit sollicitudin. Suspendisse
imperdiet justo.
简介
内存映射文件对象类似字符串和类似文件的对象。不同于通常的字符串对象,它可以是可变的。在需要字符串的时候可以使用mmap对象;例如使用re模块对内存映射文件进行进行搜索。修改单个字符:obj[index] = 'a',或通过切片更改字符串:[i1:i2] = '...'。可以读写入当前文件位置数据,并 seek()定位到文件的其他位置。
内存映射文件是由mmap的构造函数创建,在Unix和Windows有所不同。两者都需要提供文件描述符。如果要映射已打开的Python文件对象,需要使用fileno()。或者使用os.open()函数(返回文件描述符,但是如需要手工关闭)打开文件。创建可写的内存映射文件用于buffer,必须先flush()文件以确保对buffer本地修改也对映射生效。
Unix和Windows版本的构造方法都可以指定可选参数access。选项:ACCESS_READ,ACCESS_WRITE,或ACCESS_COPY,分别表示读,写,拷贝访问。Windows默认是写,。初始内存值是由文件指定,写ACCESS_READ的对象将会baoc。分配到ACCESS_READ存储器映射引发TypeError异常。ACCESS_WRITE内会影响内存和底层文件。ACCESS_COPY内影响内存,但不会更新底层文件。
#注意:这些模块所有都是2.X版本的,3.X可能没有这些模块
#注意:unix和windows下面的mmap()参数和行为是有所差别的,请看官方文档,地址如下:https://docs.python.org/2/library/mmap.html
#读取文件
"""
使用mmap()函数可以创建一个内在映射文件,第一参数是文件描述符,可以file对象的fileno()方法,或者来自os.open()
。调用都在调用mmap()之前负责打开文件,不再需要文件时要负责关闭
第二参数是要映射文件部分的大小(以字节为单位),这个值为0,则映射整个文件,如果大小大于文件当前大小,则会该文件.
"""
#注意:windows下面不支持创建长度为0的映射
#此2平台都支持一个可选关键字参数access,ACCESS_READ,ACCESS_WRITE,或ACCESS_COPY,分别表示读,写,拷贝访问。Windows默认是写,
#对内存的赋值不会写至文件
import contextlib,mmap,re
with open(r'text.txt','r')as f:
with contextlib.closing(mmap.mmap(f.fileno(),0,access=mmap.ACCESS_READ))as m:
print 'first 10 red:',m.read(10)
print 'first 10 slice:',m[:10]
print '2nd:',m.read(10)
#文件指定会跟踪通过一个分片操作访问最后一个字节
#写入
import shutil
shutil.copyfile('text.txt', 'lorem_copy.txt')
word = 'consectetuer'
reversed = word[::-1]
print 'Looking for :', word
print 'Replacing with :', reversed
with open('lorem_copy.txt', 'r+') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 0)) as m:
print 'Before:'
print m.readline().rstrip()
m.seek(0) # rewind
loc = m.find(word)
m[loc:loc+len(word)] = reversed
m.flush()
m.seek(0) # rewind
print 'After :'
print m.readline().rstrip()
f.seek(0) # rewind
print 'File :'
print f.readline().rstrip()
#内存和文件中第一行中间的单词consectetuer将被替换
#复制模式:使用ACCESS_COPY则不会改变实际存储的文件
print 'copy '*20
shutil.copyfile('lorem.txt', 'lorem_copy.txt')
word = 'consectetuer'
reversed = word[::-1]
with open('lorem_copy.txt', 'r+') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 0,
access=mmap.ACCESS_COPY)
) as m:
print 'Memory Before:'
print m.readline().rstrip()
print 'File Before :'
print f.readline().rstrip()
print
m.seek(0) # rewind
loc = m.find(word)
m[loc:loc+len(word)] = reversed
m.seek(0) # rewind
print 'Memory After :'
print m.readline().rstrip()
f.seek(0)
print 'File After :'
print f.readline().rstrip()
#正则表达式
#由于内存映射文件就类似于一个字符串,因此也适用其他处理字符串模块,如正则
print 're '*20
pattern = re.compile(r'(\.\W+)?([^.]?nulla[^.]*?\.)',
re.DOTALL | re.IGNORECASE | re.MULTILINE)
with open('lorem.txt', 'r') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 0,
access=mmap.ACCESS_READ)
) as m:
for match in pattern.findall(m):
print match[1].replace('\n', ' ')
#contextlib:使用closing()函数为内存映射文件创建一个上下文管理器
python标准库基础之mmap:内存映射文件的更多相关文章
- python 标准库基础学习之开发工具部分1学习
#2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...
- python标准库介绍——19 mmap 模块详解
==mmap 模块== (2.0 新增) ``mmap`` 模块提供了操作系统内存映射函数的接口, 如 [Example 2-13 #eg-2-13] 所示. 映射区域的行为和字符串对象类似, 但数据 ...
- mmap - 内存映射文件 - 减少一次内核空间内数据向用户空间数据拷贝的操作
关于mmap 网上有很多有用的文章,我这里主要记录,日常使用到mmap时的理解: https://www.cnblogs.com/huxiao-tee/p/4660352.html 测试代码: htt ...
- python标准库之shutil——可操作权限的文件操作库
转载自:https://www.jb51.net/article/145522.htm shutil模块提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能. 文件夹与文件操作 ...
- python标准库glob 递归目录下所有文件
import glob for i in glob.glob(r'C:\Desktop\**',recursive=True): print(i) """ re:?*[0 ...
- python linecache标准库基础学习
#python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...
- 《Python标准库》 目录
目录 译者序序前言第1章 文本1.1 string—文本常量和模板1.1.1 函数1.1.2 模板1.1.3 高级模板1.2 textwrap—格式化文本段落1.2.1 示例数据1.2.2 填充段落1 ...
- linux mmap 内存映射【转】
转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...
- linux mmap 内存映射
mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...
随机推荐
- (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)
刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...
- [Git] Automatically running tests before commits with ghooks
Wouldn't it be nice if everyone ran the tests before committing code? With ghooks, you can automatic ...
- sqlserver 2008 sa登陆的一些问题
sqlserver 2008 sa登陆 无法连接到(local)? 遇到这个问题请确保SQL主服务是开启状态: ok接下来把服务器名换成 计算机名\实例名 再次使用sa登陆,如下: 是不是可以了呢? ...
- iOS集成微信支付各种坑收录
统一下单的参数要拼接成XML格式,使用AFN请求时要对参数转义,直接传入字典给AFN无法识别(这个接口微信demo中并没有提供示例) AFHTTPRequestOperationManager *ma ...
- [转] iOS性能优化技巧
(转自:hhttp://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks#arc, http://blog.ibireme. ...
- JQuery中常用的 属性选择器
jQuery中使用$()作为选择符极大提高工作效率以及方便快捷;一些常用属性的选择器由以下几种 1) $('#id') id选择器 2) $('.class') css选择器,class类名 3) $ ...
- 来自GitHub的Android UI开源项目
最近在搞Android开发,做了一个项目后感觉,Android开发入门很是简单,但要能做出用户体验比较完美的APP实在是一件很不容易的事情!要达到一定的水准,估计还需要慢慢的积累,这里先保存一个Git ...
- SqlServer 不同服务器之间数据库连接、数据库登录、数据传递
需求:我是本地数据库想纯SQL访问其它服务器上的数据库,而不使用数据库客户端的连接.这里面就想到了数据库link,通过下面的代码进行创建以后,就可以在本地对链接的服务器数据库进行操作了--添加SQLS ...
- Xcode7 iOS9网络配置
iOS9为了增强数据访问安全,将所有的http请求都改为了https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用. & ...
- Swift 面向对象
import Foundation class Hi{ func sayHi(){ print("HI jinpanpang") } } class Hello:Hi { var ...