Python读取二进制文件时缓冲区大小与文件大小的关系
buffersize=50000
inflie = open('in.jpg','rb')
outfile = open('out.jpg','wb')
buffer = infile.read(buffersize)
while len(buffer):
outfile.write(buffer)
buffer = infile.read(buffersize)
我正在学习如何在Python中读取和写入二进制文件的基础知识,并且理解了这段代码。希望能得到一些帮助,来更好地理解这段代码。谢谢!
- 问题1:50000这个数字在缓冲区大小中是等于50KB吗?(一个.jpg文件大约是150KB)
- 问题2:接下来的数据(也就是下一个50,000字节的数据)是如何从输入文件中读取的?(前50,000字节在while循环之前就已经读取并存储了,然后写入输出文件,接下来的50,000字节是如何在没有增加范围的情况下读取的?)
- 问题3:len(buffer)表示缓冲区的大小(文件对象)。在while循环中,这个条件什么时候会变成假?
1 个回答
1
这段文档回答了你所有的问题:
file.read([size])
这个方法最多会从文件中读取指定数量的字节(如果在读取过程中遇到文件结束符EOF,可能会读取到的字节数会少于指定的数量)。如果你不指定size这个参数,或者它是负数,方法会一直读取,直到文件结束。读取到的字节会以字符串的形式返回。如果一开始就遇到文件结束,返回的会是一个空字符串。(对于某些文件,比如终端文件,遇到文件结束后继续读取是有意义的。)需要注意的是,这个方法可能会多次调用底层的C语言函数fread(),以尽量接近你指定的字节数。此外,在非阻塞模式下,即使你没有给size参数,返回的数据量也可能会少于你请求的量。
1: 是的。size
参数表示字节的数量。
2: infile.read(50000)
的意思是“从infile中最多读取50000个字节”。第二次调用这个方法时,它会自动读取文件中的下一个50000个字节。
3: buffer
不是文件本身,而是你上次从文件中读取的内容。len(buffer)
在buffer为空时会返回False
,也就是说,当文件中没有更多数据可读时。