python基础第十课--文件IO续(小白piao分享)

#1、读写压缩的数据文件:
#gzip和bz2模块的存在使得这样额操作变得极为便利
#这两个模块都提供了open()函数的其他实现,用于处理压缩文件,例如:要将压缩文件以文本形式读取,可以这样做:
import gzip
with gzip.open(‘somefile.gz’,‘wb’) as fd:
text = fd.write(b’hello’)

with gzip.open(‘somefile.gz’,‘rb’) as fd:
text = fd.read()
print(text.decode(‘utf-8’))

#2、对固定大小的记录进行迭代:
#对一定大小的数据块或者记录进行迭代
#可以利用iter()和functools.partial()来完成这个巧妙的技巧
#iter():传递一个可调用对象及一个哨兵值,可以创建出一个迭代器。得到的迭代器会重复调用用户提供的可迭代对象,
#直到返回这个哨兵值为止,此时迭代过程停止。
#functools.patial()来创建可调用对象,每次调用它时都从文件中读取固定的字节数。
#例如:
from functools import partial
RECORD_SIZE = 32
with open(‘somefile.data’,‘rb’) as fd:
record = iter(partial(fd.read,RECORD_SIZE),b’’)#将文件中的内容以32字节为单位拆成每次迭代的迭代单元,每次进行迭代
for x in record:
print(x)

b’sadfsdaffsaf\r\nsdafsfsfds12123\r\ns’
b’adasddad\r\nasdqwexzc\r\nzczxcsadsad’

#一般情况:读取二进制时多采用分块读取,而读取文本还是采用行读取的居多

#3、将二进制读取到可变缓存中去
#将二进制数据直接读取到一个可变缓冲区中,中间不经过任何拷贝环节。也许我们想原地修改数据再将它协会到文件中去
#要将数据读取到可变数组中,使用文件对象的readinto()方法即可,示例如下:
import os.path
def readinto_buffer(filename):
buf = bytearray(os.path.getsize(filename))
with open(filename,‘rb’) as f:
f.readinto(buf)
return buf

var = readinto_buffer(r’somefile.data’)
print(var)

var[:3] = b’hello’
with open(‘somefile.data’,‘wb’) as f:
f.write(var)
#bytearray(b’hellofsdaffsaf\r\nsdafsfsfds12123\r\nsadasddad\r\nasdqwexzc\r\nzczxcsadsad’)

#4、对二进制文件做内存映射
#通过内存映射的方式讲一个二进制文件加载到可变的字节数组中,这样可以随机访问其内容
#可以使用mmap模块实现对文件的内存做映射。以可移植的方式演示如何打开一个文件并对其进行内存映射
import os,mmap
def memory_map(filename,access = mmap.ACCESS_WRITE):
size = os.path.getsize(filename)
fd = os.open(filename,os.O_RDWR)#os.O_RDWR:‘r+’–>打开的文件可读可写
return mmap.mmap(fd,size,access=access)

#如何创建一个指定大小的文件?
size = 10000
with open(‘data’,‘wb’) as f:
f.seek(size-1)
f.write(b’\x00’)
#成功创建了一个10000字节大小的文件
#下边对上述文件进行内存映射操作:
m = memory_map(‘data’)#mmap.mmap()可以创建一个可以上下文管理的对象!所以可以使用with,下来自己试试看
print(len(m))#打印文件字节数
print(m[:10],m[0])
m[:11] = b’hello world’
m.close()

with open(‘data’,‘rb’) as f:
print(f.read(11))

发布了17 篇原创文章 · 获赞 1 · 访问量 355

猜你喜欢

转载自blog.csdn.net/weixin_43520503/article/details/104485404