如何读取包含 ctrl-Z 的文件,当 stdin 从文件重定向时?
我在我的Python脚本里有这样一行代码:
data = sys.stdin.read()
然后我在Windows上用文件重定向来运行这个脚本:
>> python test.py < binary_file
如果这个binary_file里面有一个字符\x1a
(也就是ctrl-Z),在Windows系统中这个字符代表文件结束(EOF),那么数据只会包含\x1a
之前的内容。我知道对于普通文件,可以用open("...", "rb")
来解决这个问题。
那么对于sys.stdin
,我该怎么处理呢?
1 个回答
3
我接下来的步骤是尝试一下 fileinput模块,不过我感觉 cmd.exe
(或者处理管道的代码)实际上是处理这个数据流的,它会查找 \0x1a
这个字节,然后给你发送一个文件结束符(EOF)。
如果真是这样,那就没办法了;操作系统根本不允许你读取这个字节之后的内容。你也无法把 stdin
切换到二进制模式,因为这个句柄是由运行时或操作系统打开的,然后传给Python。
作为一个变通办法,你可以尝试安装 Cygwin 或者 MSys,这两个工具可以给你一个真正的命令行界面(而不是1980年代那些bug的模拟)。
或者你可以试试 PowerShell。如果运气好,他们可能没有在里面重新实现这个bug。