为了账号安全,请及时绑定邮箱和手机立即绑定

为什么从 stdin 读取一行会阻止从 Python 中的 stdin.buffer 读取

为什么从 stdin 读取一行会阻止从 Python 中的 stdin.buffer 读取

MM们 2022-06-07 18:07:41
为什么从 stdin 读取一行会阻止从 Python 中的 stdin.buffer 读取片段:import sysa = sys.stdin.readline()b = sys.stdin.buffer.readline()print("A :: {}".format(a))print("B :: {}".format(b))使用运算符执行<以提供文件作为标准输入。 python script.py < text.txt输出:A :: Line_1B :: b''文件:Line_1Line_2Line_3为什么 B 不打印 Line_2 .?更新:具有相同配置但序列发生变化的片段import sysb = sys.stdin.buffer.readline()a = sys.stdin.readline()print("A :: {}".format(a))print("B :: {}".format(b))输出:A :: Line_2B :: Line_1
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

直接从标准输入读取将消耗底层字节缓冲区流。将消耗多少是内部实现的一部分,并且不受用户控制 - 但是,从标准输入读取文本内容将至少消耗缓冲区中的几个字节(并且为了提高效率),这是合乎逻辑的原因,可能会消耗更多)。

很少有人会遇到这个问题,因为在同一个应用程序中尝试以两种方式从标准输入读取是没有意义的——你要么与文本数据交互,要么在那里与二进制数据交互。(在这种情况下,如果您的二进制数据中有一些文本,您所要做的就是手动处理它,并在您的 Python 代码上显式应用字符集解码和行尾转换)。

换句话说:内部实现在读取缓冲区之前消耗缓冲区以进行翻译。

正确的做法是:选择与缓冲区或文本层进行交互,并且只在应用程序的生命周期内与之交互。


查看完整回答
反对 回复 2022-06-07
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

docs来看,该buffer对象设计用于二进制数据,而不是文本:

注意要从/向标准流写入或读取二进制数据,请使用底层二进制缓冲区对象。例如,要将字节写入标准输出,请使用 sys.stdout.buffer.write(b'abc')。但是,如果您正在编写一个库(并且不控制其代码将在哪个上下文中执行),请注意标准流可能会被替换为类似文件的对象,例如不支持缓冲区属性的 io.StringIO。


查看完整回答
反对 回复 2022-06-07
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信