Python的read()在EOF前总是返回请求的大小吗?
Python的read()方法和C语言的read函数一样吗?在到达文件的最后一部分之前,它会不会返回比请求的字节数少的数据?还是说它保证只要有数据可读,就一定会返回请求的完整字节数?
3 个回答
这其实要看你在读什么。
默认情况下,Python使用的是一种叫做 io.BufferedReader 的东西,但如果你特别关闭了缓冲功能,它就不会使用这个了:
with open(__file__, "rb", buffering=0) as file:
print(f"Unbuffered file type {type(file).__name__}")
with open(__file__, "rb", buffering=10) as file:
print(f"Explicit buffered file type {type(file).__name__}")
with open(__file__, "rb") as file:
print(f"Default [buffered] file type {type(file).__name__}")
Unbuffered file type FileIO
Explicit buffered file type BufferedReader
Default [buffered] file type BufferedReader
根据文档,io.BufferedReader
只有在遇到文件结束(EOF)或者底层操作系统的调用会阻塞时,才会读取得少一些:
read(size=- 1, /)
读取并返回指定的字节数,如果没有给定大小或者大小是负数,就会一直读取直到文件结束,或者在非阻塞模式下读取调用会阻塞。
这意味着,如果你在读取一个普通文件,BufferedReader 只有在遇到文件结束时才会读取得少,因为普通文件不会“阻塞”,即使它们返回数据需要一些时间。
但是,如果你在从 *nix 的“FIFO”(管道)中读取数据,那么如果管道中没有等待的数据,io.BufferedReader 就会返回少于你请求的字节数。
如果你完全关闭缓冲功能,那么 read()
就会返回操作系统返回的内容。即使你在读取普通文件,这也可能会返回少于你请求的字节数。所以在关闭缓冲时一定要非常小心。
好吧,Python标准库对file.read([size])是这么说的:
从文件中最多读取size字节的数据(如果在读取之前遇到文件结束符EOF,可能会读取更少)。
如果size这个参数是负数或者没有提供,就会读取所有数据,直到遇到文件结束符EOF。
... 当立即遇到文件结束符时,会返回一个空字符串。
... 另外要注意,在非阻塞模式下,即使没有给size参数,返回的数据可能会少于请求的数据。
在CPython中,除非到达文件的结束(EOF),否则它总是会返回请求的字节数。