python - 为什么从 stdin 读取一行会阻止从 Python 中的 stdin.buffer 读取
问题描述
为什么从 stdin 读取一行会阻止从 Python 中的 stdin.buffer 读取
片段:
import sys
a = sys.stdin.readline()
b = sys.stdin.buffer.readline()
print("A :: {}".format(a))
print("B :: {}".format(b))
使用运算符执行<
以提供文件作为标准输入。
python script.py < text.txt
输出:
A :: Line_1
B :: b''
文件:
Line_1
Line_2
Line_3
为什么 B 不打印 Line_2 .?
更新:
具有相同配置但序列发生变化的片段
import sys
b = sys.stdin.buffer.readline()
a = sys.stdin.readline()
print("A :: {}".format(a))
print("B :: {}".format(b))
输出:
A :: Line_2
B :: Line_1
解决方案
直接从标准输入读取将消耗底层字节缓冲区流。将消耗多少是内部实现的一部分,并且不受用户控制 - 但是,从标准输入读取文本内容将至少消耗缓冲区中的几个字节(并且为了提高效率),这是合乎逻辑的原因,可能会消耗更多)。
很少有人会遇到这个问题,因为在同一个应用程序中尝试以两种方式从标准输入读取是没有意义的——你要么与文本数据交互,要么在那里与二进制数据交互。(在这种情况下,如果您的二进制数据中有一些文本,您所要做的就是手动处理它,并在您的 Python 代码上显式应用字符集解码和行尾转换)。
换句话说:内部实现在读取缓冲区之前消耗缓冲区以进行翻译。
正确的做法是:选择与缓冲区或文本层进行交互,并且只在应用程序的生命周期内与之交互。
推荐阅读
- javascript - 开玩笑:测试超时后拒绝的承诺
- firebase - 如何增加单张签证卡在firebase中可以覆盖的项目数量
- android - 安装 react-native-onesignal 时无法解决:com.google.android.gms:play-services-ads-identifier:12.0.1
- java - 将两个对象序列化为彼此的字段
- java - Vaadin 将组件颜色设置为 hex 或 int 或 rgb
- groovy - 将字符串转换为列表 [Groovy]
- r - 当存在较短版本时,在 R 中排除字符串中的字符
- sql - Laravel 查询生成器的 SQL 子查询 JOIN 问题
- reactjs - React Table 无法正确显示数据
- html - 被 div 截断的内容