#作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是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. Android 之 资源文件的介绍及使用

    Android 之 资源文件的介绍及使用 1.资源的简单介绍:  在res文件夹中定义:字符串.颜色.数组.菜单.图片.视频等:在应用程序中使用这些资源.  2.使用资源的长处:降低代码量,同一时候为 ...

  2. MVC三和,你能辨别它?

    上次我们聊的时间MVC,而之前我们学习过三层.那么我们不禁就要问,他们说的是一回事吗.他们有什么联系吗? 三层架构(3-tier application)通常意义上的三层架构就是将整个业务应用划分为: ...

  3. Factorization Machines 学习笔记(三)回归和分类

      近期学习了一种叫做 Factorization Machines(简称 FM)的算法,它可对随意的实值向量进行预測.其主要长处包含: 1) 可用于高度稀疏数据场景:2) 具有线性的计算复杂度.本文 ...

  4. oracle之时间转换

    :取得当前日期是本月的第几周 SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; TO_CHAR(SYSDATE,'Y ...

  5. C# typeof Gettype is as &拆箱 装箱

    有时候,我们不想用值类型的值,就是想用一个引用..Net提供了一个名为装箱(boxing)的机制,它允许根据值类型来创建一个对象,然后使用对这个新对象的一个引用. 首先,回顾两个重要的事实,1.对于引 ...

  6. OD: Windows Security Techniques & GS Bypassing via C++ Virtual Function

    Windows 安全机制 漏洞的万源之本在于冯诺依曼设计的计算机模型没有将代码和数据进行区分——病毒.加壳脱壳.shellcode.跨站脚本攻击.SQL注入等都是因为计算机把数据和代码混淆这一天然缺陷 ...

  7. \r \r\n \t 的区别

    http://www.360doc.com/content/12/0530/15/16538_214756101.shtml \n 软回车:       在Windows 中表示换行且回到下一行的最开 ...

  8. .net抓取网页数据

    1.想通过代码获得某个页面的数据,首先根据右键查看页面源代码,通过分析.再通过下面代码,修改,一步步查找出所需内容,存入数据库. //根据Url地址得到网页的html源码 private string ...

  9. 线段树hdu1754

    #include<iostream>#include<stdio.h>using namespace std;const int maxa=200005;int val[max ...

  10. PHP打开PDO_MySQL扩展的配置方法

    PHP中的PDO其实是一个很好用的扩展,在一些PHPCMS系统中,开发者大多都有用到,那么如何开启PDO和PDO_MySQL扩展呢?方法同样很简单: 打开php.ini配置文件,找到extension ...