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()
|