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()可以将某文件映射至内存(进程空间), ...
随机推荐
- LaTeX笔记
1.上下标: $x^n$, $x^{123}$, $x_n$, $x_{123}$, $C_n^m$, $C_{100}^{50}$ $x^n$, $x^{123}$, $x_n$, $x_{123} ...
- hdu5067Harry And Dig Machine(TSP旅行商问题)
题目链接: huangjing 题意:给出一幅图.图中有一些点,然后从第1个点出发,然后途径全部有石头的点.最后回到原点,然后求最小距离.当初作比赛的时候不知道这就是旅行商经典问题.回来学了一下. 思 ...
- Codeforces 328A-IQ Test(数列)
A. IQ Test time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- c++ 连接两个字符串实现代码 实现类似strcat功能(转)
想实现strcat功能,直接网上找一个. 第一种: #include "stdafx.h" #include<iostream> using namespace std ...
- SPOJ 416 - Divisibility by 15(贪心)
糟烂的代码啊... 这个题目思路很简单——末位只可能为0和5,所有数字的和肯定被3整除 没有0和5的肯定不行 否则,把所有数字求和 如果被3整除,则从大到小输出 如果除3余1,则按以下顺序——删1: ...
- Linux常用命令之 查找命令 find(一)
我们都知道在Linux中有着上千条的命令,而常用命令不过百条. 我们也知道在Linux里面“一切皆文件”,那么如何能够快速的找到你想要找的东西就显得尤为重要. find是Linux里面最重要的命令之一 ...
- 自定义ViewGroup 流式布局
使用 public class MainActivity extends Activity { @Override protected void onCreate(Bundle sav ...
- SVN中trunk,branches,tags用法详解
原文地址:http://www.cnblogs.com/dafozhang/archive/2012/06/28/2567769.html Subversion有一个很标准的目录结构,是这样的.比如项 ...
- foreach遍历扩展(二)
一.前言 假设存在一个数组,其遍历模式是根据索引进行遍历的:又假设存在一个HashTable,其遍历模式是根据键值进行遍历的:无论哪种集合,如果它们的遍历没有一个共同的接口,那么在客户端进行调用的时候 ...
- java 修改文件名
// 修改文件名 public static boolean modifyFileName(String serverPath, String oldFileName, String newLogin ...