2017-05-24 244 views
0

Windows上的Python 2.7。試圖使用mmap模塊,但使用打開文件處理程序而不是with open(filename, "r+b") as f:我只是打開它並得到一個WindowsError [Error 5]使用mmap打開文件失敗

它重現,要麼以管理員身份運行,要麼不以管理員身份運行。 使用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') 

而現在它的正常工作。我現在在做對嗎?

+0

爲什麼在文本模式下打開文件? – user2357112

+0

以管理員身份打開cmd,然後從那裏調用您的python腳本 – Aaron

+0

或提供絕對文件名! – Meitham

回答

0

是的,就是這樣,謝謝大家!

# -*- 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') 
+0

[documention](https://docs.python.org/2/library/mmap.html#module-mmap)說,在Windows上,如果你不喜歡'不指定'access',它默認爲'ACCESS_WRITE'。關鍵是你的「正確的做法」完全取決於你想要什麼(你從未真正在你的問題中指定過的東西)。 – martineau

+0

@martineau是的,這是一個嘗試讀取二進制文件。 – pmus