2015-04-15 5 views
4

У меня возникли проблемы с получением файла на карте памяти, и я надеялся решить эту проблему. Я подробно описал проблему и показал свой код ниже.запрос файла mmap для пустого файла в Python

Что я импортирование:

import os 
import mmap 

Теперь для кода:

file = r'otest'       # our file name 
if os.path.isfile(file):    # test to see if the file exists 
os.remove(file)      # if it does, delete it 
f = open(file, 'wb')     # Creates our empty file to write to 
print(os.getcwd()) 

Вот где я сталкиваюсь с проблемой с моим кодом (я включил оба, и есть один закомментирована каждый раз, когда я запустить программу):

mfile = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) 
#mfile = mmap.mmap(f.fileno(), 10**7, access=mmap.ACCESS_WRITE) 

Я сталкиваюсь ошибку либо из MFile линий. Для строки mmap.mmap с аргументом 0 Я получаю эту ошибку: ValueError: cannot mmap an empty file. Если я вместо этого использовать 10**7 аргумент, я получаю эту ошибку вместо того, чтобы: PermissionError: [WinError 5] Access is denied

И закончить его:

""" 
    Other stuff goes here 
""" 
f.close()        # close out the file 

«Другая материал здесь» это просто место держатель для где я собираюсь поставить больше кода, чтобы делать что-то.

Просто добавить, я нашел this thread, который я думал, что может помочь, но оба ftruncate и os.truncate функции не похоже, чтобы помочь проблему под рукой.

+0

'mmap()' в файле не изменится размер файла. Если вы хотите 'mmap()' 1e7 байт файла, вам нужно сделать что-то заранее, чтобы убедиться, что файл на самом деле по крайней мере такой большой ... – twalberg

+0

Я это считал, но понял, что должен быть способ заполнения данных в заранее выделенный объем пространства, отведенного для mmap(), а не начинающийся с файла предполагаемого размера. – Jeremie

ответ

1

Как связанная передача, mmap требует, чтобы вы сначала создали файл, а затем изменили его. Итак, сначала создайте пустой файл делать что-то вроде:

f = open(FILENAME, "wb") 
f.write(FILESIZE*b'\0') 
f.close() 

Тогда вы сможете получить доступ к файлу и отображение его с помощью:

f = open(FILENAME, "r+b") 
mapf = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) 

Обратите внимание на то, как файл быть открыт. Помните, что вы можете очистить свой буфер, делая (более подробно здесь Usage of sys.stdout.flush() method):

sys.stdout.flush() 

Позвольте мне знать, если вы хотите, чтобы я вдаваться в подробности о любой из этих точек.