45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
import os
|
||
import mmap
|
||
|
||
if __name__ == '__main__':
|
||
|
||
def memory_map(file_path, access=mmap.ACCESS_WRITE):
|
||
size = os.path.getsize(file_path)
|
||
fild_data = os.open(file_path, os.O_RDWR)
|
||
|
||
return mmap.mmap(fild_data, size, access=access)
|
||
|
||
SIZE = 1000000
|
||
# with open(r'5.文件与IO/10.data', 'wb') as f:
|
||
# f.seek(SIZE - 1)
|
||
# f.write(b'\x00')
|
||
|
||
m = memory_map('5.文件与IO/10.data')
|
||
print(len(m))
|
||
m[0:11] = b'Hello World'
|
||
m.close()
|
||
|
||
with open(r'5.文件与IO/10.data', 'rb') as f:
|
||
print(f.read(11))
|
||
|
||
# 当然,这个函数得益于他的open内嵌,也能在with的上下文中打开并自动关闭
|
||
with memory_map('5.文件与IO/10.data') as m:
|
||
print(len(m))
|
||
print(m.closed)
|
||
|
||
# 当然,如果你想只读,可以在access里设置成mmp.ACCESS_READ,
|
||
# 如果只想把文件拷贝到内存而不是直接在文件里修改,mmp.ACCESS_COPY非常有用
|
||
# mmap和memoryview又有所不同
|
||
m = memory_map('5.文件与IO/10.data')
|
||
v = memoryview(m).cast('I')
|
||
v[0] = 7
|
||
m[0:4] = b'\x07\x01\x00\x00'
|
||
|
||
print(m[0:4])
|
||
print(v[0])
|
||
# 可以看出来,memoryview在做转换的时候用的是小端存储
|
||
print(int.from_bytes(m[0:4], byteorder='little'))
|
||
print(int.from_bytes(m[0:4], byteorder='big'))
|
||
v.release()
|
||
m.close()
|