f.write 与 print >> f 的区别

49 投票
7 回答
34695 浏览
提问于 2025-04-17 08:49

在Python中,有至少两种方法可以写入文件:

f = open(file, 'w')
f.write(string)

或者

f = open(file, 'w')
print >> f, string     # in python 2
print(string, file=f)  # in python 3

这两种方法有什么区别吗?或者说哪种写法更符合Python的风格?我想把一堆HTML写入文件,所以需要在文件中用很多写入/打印的语句(但我不需要模板引擎)。

7 个回答

4

我同意@agf的看法。

我更喜欢用 print(..., file=f),因为它更灵活。

with open('test.txt', 'w') as f:
    print('str', file=f)
    print(1, 20, file=f)

而且,把现有的 print 命令转换过来也很简单。

write 只接受字符串。

22

我对这里一些观点有点不同,认为 print >> f 是多余的,应该用 f.write 来代替。

其实,printfile.write 是两种完全不同的操作。file.write 只是直接把一个字符串写入文件。而 print 更像是“把值以文本的形式输出到标准输出”。自然,把一个字符串以文本形式输出的结果就是这个字符串,所以 print >> f, my_stringf.write(my_string) 几乎是可以互换的(除了多了一个换行符)。不过,你在选择 file.writeprint 时,通常应该根据你在做什么来决定;你是在把字符串写入文件,还是在把值输出到文件呢?

当然,print 并不是绝对 必要 的,因为你可以用 file.write 来实现它。但 file.write 也不是绝对必要的,因为你可以用 os 中处理文件描述符的操作来实现。实际上,它们是在不同层次上的操作,你应该使用更适合你需求的那个(通常是与其他代码相近的层次,或者是不会妨碍你的最高层次)。

我确实觉得 print >> f 的语法相当糟糕,这很好地说明了为什么 print 一直应该是一个函数。在 Python 3 中这个问题得到了很大的改善。但即使你在写打算迁移到 Python 3 的 Python 2 代码,把 print >> f, thing1, thing2, thing3, ... 转换成 print(thing1, thing2, thing3, file=f) 要简单得多,而不是自己写代码来实现 print 的输出效果,然后再调用 f.write(text)。我相信从 Python 2 到 Python 3 的半自动转换器甚至会为你完成这个转换,如果你避免使用 print >> f 的形式,它就无法做到这一点。

总之:用 print 来输出值到标准输出(或文件)。用 f.write 来把文本写入文件。

41

print 做的事情是 file.write 做不到的,它让你在处理一些简单的内容时,不用费心去格式化字符串。

它会在不同的参数之间自动加上空格,并在最后加上换行符。

print "a", "b" # prints something like "a b\n"

它会调用对象的 __str____repr__ 特殊方法,把对象转换成字符串。

print 1 # prints something like "1\n"

如果你用 file.write 而不是 print,你就得手动去做这些事情。

撰写回答