至少有两种方法可以在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
这两者有区别吗?或者是更多的Pythonic?我正在尝试写一堆HTML文件,所以我需要通过我的文件写一堆写/打印语句(但我不需要模板引擎)。
答案 0 :(得分:31)
print
做file.write
没有做的事情,允许你跳过一些基本的字符串格式。
它在参数之间插入空格并附加行终止符。
print "a", "b" # prints something like "a b\n"
它调用对象的__str__
或__repr__
特殊方法将其转换为字符串。
print 1 # prints something like "1\n"
如果您使用file.write
代替print
,则必须手动执行这些操作。
答案 1 :(得分:15)
我对这里表达的一些观点有些不同意,print >> f
是多余的,应该避免使用f.write
。
print
和file.write
是完全不同的操作。 file.write
只是直接将字符串写入文件。 print
更像是"将值呈现为stdout为text"。当然,将字符串呈现为文本的结果只是字符串,因此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代码,它也很容易转换{{1} }转到print >> f, thing1, thing2, thing3, ...
,而不是将您自己的代码转换为相同的print(thing1, thing2, thing3, file=f)
渲染,然后调用print
。我非常确定从Python 2到Python 3的半自动转换器甚至可以为您进行转换,如果您避开f.write(text)
形式,它就无法做到。
底线:使用print >> f
将值呈现给stdout(或文件)。使用print
将文本写入文件。
答案 2 :(得分:4)
你不应该做任何一件事。最Pythonic的事情是使用Python 3打印功能(而不是Python 2 print 语句):
<img />
当然,执行此操作的理想方法是使用Python 3.但如果您使用Python 2,则可以使用文件顶部的future statement启用它:
f = open(file, 'w')
print(string, file=f)
请注意,这会以其他方式更改打印,最明显的是您需要在其参数周围添加括号。但是这些改变都是改进,这是改变Python 3的全部原因。当你在使用它时,考虑使用所有未来的语句来尽可能多地从Python 3获得后向改进。
答案 3 :(得分:2)
同意@agf
由于其灵活性,我倾向于print(..., file=f)
。
with open('test.txt', 'w') as f:
print('str', file=f)
print(1, 20, file=f)
转换现有的print
命令也很容易。
write
只接受字符串。
答案 4 :(得分:1)
print
上的文档可能有助于解释这一点:print statement(Python 2.7文档)。
print
打印到标准输出,实际上是一个“类文件”对象(sys.stdout
)。标准输出本身具有write()
方法。使用print >> f
似乎是一种不必要的抽象。
另外,对我来说这似乎太冗长了。 f.write()
没问题。
答案 5 :(得分:1)
作为bottonline:在写入文件时使用file.write。
“&gt;&gt;”用于打印的成语是在Python早期从C ++中借用的,而且非常简单 - 在Python 3.x中不再存在 - 人们可以使用print(现在是函数而不是语句)来写入文件 - 但没有特殊的语法。
正如@agf在他的回答中指出的那样,使用“print”写入文件比简单地调用write更多的东西 - 它会自动调用str(obj)来获取对象的字符串表示,而.write需要一个(byte)字符串作为参数传递 - 在Python世界中“显式优于隐式”,因此更多的动机是使用file.write。
答案 6 :(得分:1)
这是使用上下文处理程序的首选方法:
with open(file, 'w') as f:
f.write(string)
在python 2上我更喜欢file.write
,因为不推荐使用>>
语法。对于python 3,你可能更喜欢使用print函数,你应该注意做一些额外的事情(例如自动将数字转换为字符串等)。