【问题标题】:What's Python's equivalent to C's read function?Python 与 C 的 read 函数等价的是什么?
【发布时间】:2017-04-15 03:56:57
【问题描述】:

C 的read:

read() 函数将尝试从与打开的文件描述符 fildes 关联的文件中读取 nbyte 字节到 buf 指向的缓冲区中。

成功完成后,这些函数应返回一个非负整数,指示实际读取的字节数。否则,函数应返回 -1 并设置 errno 以指示错误。

Python 的read

从流中最多读取 n 个字符。

从底层缓冲区读取,直到我们有 n 个字符或我们点击 EOF。 如果 n 为负数或省略,则读取直到 EOF。

粗体字是我的。基本上,如果当前可用的数据小于缓冲区大小,Python 会坚持寻找 EOF……如何让它简单地返回可用的数据?

【问题讨论】:

  • 它确实返回了可用的内容,file.read(1024) 将返回n 字符,其中n 是最多1024 个可用的字符数。你能用一个可重复的例子说明你需要什么吗?
  • @RafaelBarros 仅当从非阻塞资源(例如常规文件)读取时才如此。从套接字或管道读取时,C 的read() 将等待只有 一些 数据可用,然后它将返回数据。 Python 的 file.read 将与 C 的 fread() 一样,尝试返回所有请求的数据,除非遇到错误或 EOF。
  • C 语言中没有read。您引用的是您的操作系统提供的 API 手册。此类 API 通常具有针对 C 的绑定,但幸运的是也针对 Python。你想看看posix.reados.read

标签: python c


【解决方案1】:

“Python 的 read”我假设您的意思是 file 对象的 read 方法。该方法在精神上更接近 C 的 fread:它实现了缓冲并尝试满足请求的数量,除非由于 IO 错误或文件结束条件而无法满足。

如果您确实需要调用许多 C 环境中可用的 read() 函数,您可以调用 os.read() 来调用底层 C 函数。唯一的区别是它将读取的数据作为字节字符串返回,并且在 C 函数返回 -1 的情况下引发异常。

如果你调用os.read(),记得给它提供文件对象上使用fileno方法获得的文件描述符,或者os模块中的函数返回的文件描述符,例如os.openos.pipe等。还要记住不要混合调用os.open()file.open(),因为后者会进行缓冲,并可能导致以后对os.open() 的调用不返回缓冲的数据。

【讨论】:

  • 就是这样。其实你只需要写os.read,其余的我都明白。睡眠不足会让一个人提出奇怪的问题。非常感谢。
  • 顺便说一句,os.read 在 Python 3 中返回一个 bytes(应该如此)。所以我会继续使用它。
  • @Cyker 谢谢,我现在将其更正为“字节字符串”,指的是 Python 2 中的 str(字节字符串)和 Python 3 中的 bytes
猜你喜欢
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多