f.write 与 print >> f 的区别
在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 个回答
我同意@agf的看法。
我更喜欢用 print(..., file=f)
,因为它更灵活。
with open('test.txt', 'w') as f:
print('str', file=f)
print(1, 20, file=f)
而且,把现有的 print
命令转换过来也很简单。
write
只接受字符串。
我对这里一些观点有点不同,认为 print >> f
是多余的,应该用 f.write
来代替。
其实,print
和 file.write
是两种完全不同的操作。file.write
只是直接把一个字符串写入文件。而 print
更像是“把值以文本的形式输出到标准输出”。自然,把一个字符串以文本形式输出的结果就是这个字符串,所以 print >> f, my_string
和 f.write(my_string)
几乎是可以互换的(除了多了一个换行符)。不过,你在选择 file.write
和 print
时,通常应该根据你在做什么来决定;你是在把字符串写入文件,还是在把值输出到文件呢?
当然,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
来把文本写入文件。
print
做的事情是 file.write
做不到的,它让你在处理一些简单的内容时,不用费心去格式化字符串。
它会在不同的参数之间自动加上空格,并在最后加上换行符。
print "a", "b" # prints something like "a b\n"
它会调用对象的 __str__
或 __repr__
特殊方法,把对象转换成字符串。
print 1 # prints something like "1\n"
如果你用 file.write
而不是 print
,你就得手动去做这些事情。