#作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是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:内存映射文件的更多相关文章

  1. python 标准库基础学习之开发工具部分1学习

    #2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...

  2. python标准库介绍——19 mmap 模块详解

    ==mmap 模块== (2.0 新增) ``mmap`` 模块提供了操作系统内存映射函数的接口, 如 [Example 2-13 #eg-2-13] 所示. 映射区域的行为和字符串对象类似, 但数据 ...

  3. mmap - 内存映射文件 - 减少一次内核空间内数据向用户空间数据拷贝的操作

    关于mmap 网上有很多有用的文章,我这里主要记录,日常使用到mmap时的理解: https://www.cnblogs.com/huxiao-tee/p/4660352.html 测试代码: htt ...

  4. python标准库之shutil——可操作权限的文件操作库

    转载自:https://www.jb51.net/article/145522.htm shutil模块提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能. 文件夹与文件操作 ...

  5. python标准库glob 递归目录下所有文件

    import glob for i in glob.glob(r'C:\Desktop\**',recursive=True): print(i) """ re:?*[0 ...

  6. python linecache标准库基础学习

    #python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...

  7. 《Python标准库》 目录

    目录 译者序序前言第1章 文本1.1 string—文本常量和模板1.1.1 函数1.1.2 模板1.1.3 高级模板1.2 textwrap—格式化文本段落1.2.1 示例数据1.2.2 填充段落1 ...

  8. linux mmap 内存映射【转】

    转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...

  9. linux mmap 内存映射

    mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...

随机推荐

  1. 好看的Select下拉框是如何制造的

    现在在大多数网站中都能看到很华丽的Select下拉框,他们是如何实现的呢?使用默认select肯定是不好实现,我们可以使用div+js去模拟出来select的功能,并且又能很简单的去美化它. CSS代 ...

  2. mevan引入容联云通讯jar

    首先从官网下载jar 然后拷贝到lib目录下 最后在pom.xml中这样写 <dependency> <groupId>cn.com</groupId> <a ...

  3. Nginx 主配置文件参数详解

    Nginx 主配置文件参数详解 Nginx 安装完毕后,会有响应的安装目录,安装目录里 nginx.conf 为 nginx 的主配置文件, ginx 主配置文件分为 4 部分,main(全局配置). ...

  4. 小学生之KTV项目文档(bdqn)

    第一步:创建数据库连接方法和打开方法和关闭方法! 1 public class DBHelper 2 { 3 private string str = "server=.;database= ...

  5. Objective-C基础之──多态

    Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...

  6. C/C++中的拷贝构造函数和赋值构造函数

    代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: A(){ cou ...

  7. Google Guava的splitter用法

    google的guava库是个很不错的工具库,这次来学习其spliiter的用法,它是一个专门用来 分隔字符串的工具类,其中有四种用法,分别来小结 1 基本用法: String str = " ...

  8. javascript之事件绑定

    曾经写过一篇随笔,attachEvent和addEventListener,跟本文内容有很多相似之处 本文链接:javascript之事件绑定 1.原始写法 <div onclick=" ...

  9. 扩展编写jquery插件的方法

    比如要扩展验证功能(jquery.validate.js)中的 messages: { required: "This field is required.", remote: & ...

  10. 转载:css3 box-shadow投影发光效果

    转载网址:http://www.wufangbo.com/css3-box-shadow/ CSS3的box-shadow属性 可以让我们轻松实现图层阴影效果.我们来实战详解一下这个属性. 1. bo ...