f.write vs print>> F

时间:2011-12-22 00:50:25

标签: python

至少有两种方法可以在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文件,所以我需要通过我的文件写一堆写/打印语句(但我不需要模板引擎)。

7 个答案:

答案 0 :(得分:31)

printfile.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

printfile.write是完全不同的操作。 file.write只是直接将字符串写入文件。 print更像是"将值呈现为stdout为text"。当然,将字符串呈现为文本的结果只是字符串,因此print >> f, my_stringf.write(my_string) 几乎可互换(除了添加换行符)。但是,您在file.writeprint之间的选择通常应基于您正在做的事情;你是在给文件写一个字符串,还是在文件中呈现值?

当然,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函数,你应该注意做一些额外的事情(例如自动将数字转换为字符串等)。