【发布时间】:2021-02-26 13:37:52
【问题描述】:
在最近的 Python 3.x 中,open 的默认行为是以 通用换行符 模式 (newline=None) 打开文件,这意味着如果我打开这样的文件:
f = open("file.txt")
然后在使用 f.readline()、for line in f: 等时,所有不同的行尾 (CRLF/CR/LF) 都会转换为 "\n"。
但是,在处理sys.stdin时,不同的行尾没有被转换(至少在Linux上,读取一个CRLF文件意味着sys.stdin.readline()的结果以"\r\n"结尾)。这意味着sys.stdin 是使用不同的newline 设置打开的。有什么方法可以影响打开sys.stdin时使用的参数吗?
更一般地说,Python 中是否有类似于 Perl 的 binmode 的东西可以改变从 sys.stdin 读取/写入到 sys.stdout 的工作方式?
为了清楚起见,我知道我可以自己进行 CRLF→LF 转换。这不是这个问题的目的。
【问题讨论】:
-
在 Python 3.x 中,
stdout和stdin只是普通的TextIOWrapper对象,因此您不需要 类似binmode的对象;你可以访问sys.stdout.buffer来获取二进制文件(或sys.stdout.buffer.raw来获取它下面的原始无缓冲文件)。这能满足您的需求吗? -
我猜肯定有一种方法可以将标准输入作为文件打开(使用 open 命令),至少使用 linux(虽然我找不到)。
-
@abarnert 我希望
sys.stdin的行为与open返回的文件句柄相同,并且我希望能够为open指定参数(例如newline)。我如何使用底层二进制文件或原始文件来实现这一点? -
嗯,你的问题是问多个问题。使用
buffer或buffer.raw为您提供相当于Perl 的binmode,这就是您所说的“更普遍地”想要的。你实际上不能让sys.stdin表现得像sys.stdin.buffer(好吧,你总是可以做sys.stdin = sys.stdin.buffer,但这样做会中断对input的调用,以及任何期望stdin成为文本文件的库,并且会让任何读者感到困惑,所以我想它更shouildn't而不是can't),但你可以使用sys.stdin.buffer。 -
您似乎也在问是否可以将相同的 fd 包装在一个新的文件对象中?这很简单:
myin = open(sys.stdin.fileno(), <whatever options you want>),然后使用myin。在这种情况下,如果您以文本模式打开,您可以安全地sys.stdin = myin而不会破坏任何内容。
标签: python python-3.x