【问题标题】:Open file with mmap fails使用 mmap 打开文件失败
【发布时间】:2017-05-24 16:43:41
【问题描述】:

Windows 上的 Python 2.7。尝试使用 mmap 模块,但使用打开文件处理程序而不是 with open(filename, "r+b") as f: 我只是打开它并得到一个 WindowsError [Error 5]

它确实会重现,无论是否以管理员身份运行。 使用codecs.open() 并不能解决问题。

# -*- coding: utf8 -*-
from __future__ import print_function
import mmap

class QSHFile(object):
    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename, 'r')
        self.fileno = self.file.fileno()
        self.mm = mmap.mmap(self.fileno, 0)
        print(self.mm[:5])  # prints first 5


if __name__ == '__main__':
    qsh = QSHFile('example.qsh')

经过一番研究,我进入了:

#! /usr/bin/python
# -*- coding: utf8 -*-
from __future__ import print_function
from mmap import ACCESS_READ, mmap

class QSHFile(object):
    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename, 'rb')
        self.fileno = self.file.fileno()
        self.mm = mmap(self.fileno, 0, access=ACCESS_READ)
        print(self.mm[:5])

if __name__ == '__main__':
    qsh = QSHFile('example.qsh')

现在它工作正常。我现在做对了吗?

【问题讨论】:

  • 为什么要以文本模式打开文件?
  • 以管理员身份打开cmd,然后从那里调用你的python脚本
  • 或提供绝对文件名!
  • from mmap import ACCESS_READ, mmap ... self.file = open(filename, 'rb') ... self.mm = mmap(self.fileno, 0, access=ACCESS_READ) 帮助,现在测试
  • 还要确保当前没有其他程序正在使用该文件

标签: python windows python-2.7 mmap


【解决方案1】:

是的,就是这样,谢谢大家!

# -*- coding: utf8 -*-
from __future__ import print_function
from mmap import ACCESS_READ, mmap
from binascii import hexlify as hex

class QSHFile(object):
    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename, 'rb')
        print('File [%s] opened' % self.filename)
        self.fileno = self.file.fileno()
        self.mm = mmap(self.fileno, 0, access=ACCESS_READ)
        print('File size: %s bytes' % self.mm.size())
        print(hex(self.mm[:5]))


if __name__ == '__main__':
    qsh = QSHFile('example.qsh')

【讨论】:

  • documention 表示,在 Windows 上,如果您不指定 access,则默认为 ACCESS_WRITE。关键是您的“正确方法”完全取决于您想要什么(您从未在问题中真正指定的东西)。
猜你喜欢
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多