Python中的三种打印方式 — 何时使用?
根据Tim Peters的说法,“应该有一种——最好只有一种——明显的方法来做这件事。”在Python中,似乎有三种打印信息的方法:
print('Hello World', end='')
sys.stdout.write('Hello World')
os.write(1, b'Hello World')
问题:有没有一些最佳实践的建议,说明在程序中什么时候应该使用这三种不同的打印方法?
3 个回答
这两种方法需要导入整个模块。仅从这一点来看,print() 是最好的标准使用选项。
sys.stdout 在标准输出可能会改变时非常有用。这给了我们在处理数据流时很大的灵活性。
os.write 适用于特定操作系统的写入任务(比如非阻塞写入)。
这个问题在这个网站上已经被问过很多次,关于 sys.stdout 和 print 的区别:
Python - sys.stdout.write 和 print 的区别
print() 和 sys.stdout.write(): 哪个更好,为什么?
这里有一个使用 os.write 的例子(下面的问题展示了非阻塞文件写入)。这个函数可能只在某些操作系统上有用,但它仍然需要保持可移植性,即使某些操作系统不支持不同或特殊的行为。
对我来说,使用print是输出到标准输出(stdout)的正确方式,但:
其实,sys.stdout.write这个方法存在是有原因的——想象一下,有一个类可以生成一些文本输出,而你希望它可以选择输出到标准输出、磁盘上的文件,或者一个字符串。理想情况下,这个类根本不应该关心它正在写入什么类型的输出。你只需要给这个类一个文件对象,只要这个对象支持写入的方法,它就可以用这个方法来输出文本。
注意,Tim的说法是完全正确的:只有一种明显的方法可以做到这一点,就是使用print()
。
你提到的另外两种方法有不同的目的。
如果我们想总结这三种选择的目标:
print
是一个高级函数,它可以让你把内容写到标准输出(或者其他文件)。它提供了一个简单易读的接口,还有一些很酷的选项,比如如何分隔每个项目,或者是否要添加结束符等等。这是你大多数时候想要做的事情。sys.stdout.write
只是文件对象的一种方法。所以sys.stdout
的真正意义在于你可以像处理其他文件一样使用它。这在你需要处理一个期望接收文件的函数时很有用,这样你就可以让它直接在标准输出上打印文本。换句话说,你根本不应该使用
sys.stdout.write
。你只需将sys.stdout
传递给需要文件的代码。注意:在python2中,有些情况下使用
print
语句产生的代码比调用sys.stdout.write
要差。然而,print
函数允许你定义分隔符和结束符,从而避免了几乎所有这些特殊情况。os.write
是一个低级调用,用于写入文件。你必须手动编码内容,并且还需要显式传递文件描述符。这是为了处理一些原因无法在更高级接口上实现的低级代码。你几乎不想直接调用这个,因为它不是必需的,而且API比其他方法差。
注意,如果你有代码需要写入文件,最好这样做:
my_file.write(a)
# ...
my_file.write(b)
# ...
my_file.write(c)
而不是:
print(a, file=my_file)
# ...
print(b, file=my_file)
# ...
print(c, file=my_file)
因为这样更符合DRY原则。使用print
时,你每次都必须重复file=
。如果你只需要在代码的一个地方写入,这样做没问题,但如果你有5/6个不同的写入,直接调用write
方法会简单得多。