Python的read()在EOF前总是返回请求的大小吗?

3 投票
3 回答
1441 浏览
提问于 2025-04-17 02:04

Python的read()方法和C语言的read函数一样吗?在到达文件的最后一部分之前,它会不会返回比请求的字节数少的数据?还是说它保证只要有数据可读,就一定会返回请求的完整字节数?

3 个回答

1

这其实要看你在读什么。

默认情况下,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() 就会返回操作系统返回的内容。即使你在读取普通文件,这也可能会返回少于你请求的字节数。所以在关闭缓冲时一定要非常小心。

4

好吧,Python标准库对file.read([size])是这么说的:

从文件中最多读取size字节的数据(如果在读取之前遇到文件结束符EOF,可能会读取更少)。 如果size这个参数是负数或者没有提供,就会读取所有数据,直到遇到文件结束符EOF。 ... 当立即遇到文件结束符时,会返回一个空字符串。 ... 另外要注意,在非阻塞模式下,即使没有给size参数,返回的数据可能会少于请求的数据。

1

在CPython中,除非到达文件的结束(EOF),否则它总是会返回请求的字节数。

撰写回答