gpt4 book ai didi

python - 更改在 Python 3 中打开标准输入/标准输出的方式

转载 作者:行者123 更新时间:2023-11-28 17:06:44 26 4
gpt4 key购买 nike

在最近的 Python 3.x 中,open 的默认行为是以通用换行符模式打开文件(newline=None) ,这意味着如果我打开这样的文件:

f = open("file.txt")

然后在使用f.readline()时,所有不同的行结尾(CRLF/CR/LF)都被转换成"\n"for line在 f: 等中

然而,在处理sys.stdin时,不同的行尾并没有转换(至少在Linux上,读取一个CRLF文件意味着sys.stdin.readline( )"\r\n") 结尾。这意味着 sys.stdin 使用不同的 newline 设置打开。有什么方法可以影响用于打开 sys.stdin 的参数吗?

更一般地说,Python 中是否存在类似于 Perl 的 binmode 的东西,它允许更改从 sys.stdin 读取/写入 sys.stdout< 的方式 有效吗?

澄清一下,我知道我可以自己进行 CRLF→LF 转换。这不是这个问题的目的。

最佳答案

没有办法完全替换 Python 在 sys.stdinsys.stdout 中包装 stdin 和 stdout 管道的方式。 (有一些有限控制,比如 the -u option` ,但仅此而已。)

但是,您还要求其他多种东西,所有这些都是可能的,其中一些可能是您想要的。


首先,sys.stdin 只是一个普通的 TextIOWrapper ,由 open 返回(在文本模式下)。这意味着你可以访问它的底层二进制对象,或者它下面的原始无缓冲文件对象,或者它下面的操作系统文件描述符,就像任何其他文本文件一样:

sys.stdin.buffer
sys.stdin.buffer.raw
sys.stdin.fileno()

通常,这就是您所需要的。您不会想要实际替换 sys.stdin = sys.stdin.buffer。这会破坏 inputfileinput 模块,谁知道还有什么期望 stdin 是文本文件。但是您可以只使用 sys.stdin.buffer 而不是 sys.stdin,它大致相当于我认为您从 perl 的 binmode< 中寻找的内容.


如果您想要一个包含不同选项的 TextIOWrapper,您也可以这样做。

对于最简单的情况,最简单的方法就是按照您希望调用 open 的方式调用 open,并传递文件描述符:

sin = open(sys.stdin.fileno(), <your open arguments here>)

对于不太重要的情况,您可能需要阅读 TextIOWrapper 文档(以及 BufferedReaderio 模块中的其他类型)并包装完全按照您想要的方式制作您想要的部分。但通常,open 就足够了。

无论哪种方式,您都可以使用 sin 代替 sys.stdin

或者,因为这现在一个非常好的TextIOWrapper(假设您在文本模式下打开ed),它 安全合理地替换 sys.stdin:

sys.stdin = sin

……现在 input 等将继续工作,并将按照您希望的方式工作。

关于python - 更改在 Python 3 中打开标准输入/标准输出的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50476200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com