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

3 投票
1 回答
975 浏览
提问于 2025-04-18 02:19

我在我的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。

撰写回答