Python 从文件重定向stdin时,如何读取包含ctrl-Z的文件?

Python 从文件重定向stdin时,如何读取包含ctrl-Z的文件?,python,windows,end-of-life,Python,Windows,End Of Life,我的python脚本中有这样一行代码: data = sys.stdin.read() 然后在Windows上运行带有文件重定向的脚本: >>python test.py'\n')我已经测试了包含0x1a的文件,0x1a后面的字节不能读入“数据”。然后是控制台程序读取并检查这个字节,因为这个特定值实际上没有什么特殊之处。一个字节的数据就是一个字节的数据就是一个字节的数据。。。但正如我在另一条评论中所说的,从未以文本模式打开的文件中读取二进制数据将是一件麻烦事,不管怎样,不要这样做。如果Wind

我的python脚本中有这样一行代码:

data = sys.stdin.read()
然后在Windows上运行带有文件重定向的脚本:

>>python test.py<二进制文件

如果二进制文件包含Windows中的
\x1a
(ctrl-Z)即
EOF
,则数据将只包含
\x1a
之前的字符串。我知道这可以通过
open(“…”,“rb”)
为常规文件修复


对于
sys.stdin
,我将如何处理此问题?

我的下一步将是尝试,但我的直觉是
cmd.exe
(或处理管道的代码)确实处理流,查找
\0x1a
字节并向您发送EOF

如果是这样的话,你无能为力;操作系统根本不允许你读取超过这个字节的内容。无法将stdin“切换”到二进制模式,因为此句柄由运行时或操作系统打开,然后传递给Python

作为一种解决方法,您可以尝试安装或安装一个真正的shell(而不是模拟20世纪80年代创建的bug)


或者试试看。如果你幸运的话,他们没有在那里重新实现这个错误。

在控制台窗口中按CTRL-Z将关闭输入,从而使程序获得文件结尾。但是,导致EOF的不是实际字节
0x1a
。值
0x1a
与任何其他数据字节一样,只是一个普通的数据字节。另一方面,从Windows系统上的标准输入读取二进制数据可能会遇到其他问题。最重要的是字节序列
0x0d 0x0a
将仅转换为
0x0a
。也就是说,后跟换行符的回车符将被转换为仅换行符(
'\r\n'
->
'\n'
)我已经测试了包含0x1a的文件,0x1a后面的字节不能读入“数据”。然后是控制台程序读取并检查这个字节,因为这个特定值实际上没有什么特殊之处。一个字节的数据就是一个字节的数据就是一个字节的数据。。。但正如我在另一条评论中所说的,从未以文本模式打开的文件中读取二进制数据将是一件麻烦事,不管怎样,不要这样做。如果Windows上的管道/控制台处理程序在输入中出现
\0x1a
时停止,我一点也不会感到惊讶。谢谢。我将检查文件输入模块。至于Powershell,我发现重定向操作符的Powershell使用对象管道: