Python读取二进制文件时缓冲区大小与文件大小的关系

2 投票
1 回答
15575 浏览
提问于 2025-04-18 03:51
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,也就是说,当文件中没有更多数据可读时。

撰写回答