如何在现代Python中向文件写入一行?我听说这是不赞成的:

print >>f, "hi there"

另外,“\n”在所有平台上都可以工作吗,还是我应该在Windows上使用“\r\n”?


当前回答

你也可以这样使用io模块:

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)

其他回答

如果你要写很多数据,而且速度很重要,你可能应该使用f.r ay(…)。我做了一个快速的速度比较,它比打印快得多(…, file=f)当执行大量写操作时。

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

在我的机器上,平均写用时2.45秒,而打印用时约为4倍(9.76秒)。也就是说,在大多数现实场景中,这不是一个问题。

如果你选择打印(…, file=f)你可能会发现你想要时不时地抑制换行,或者用其他东西替换它。这可以通过设置可选的end参数来完成,例如;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

无论您选择哪种方式,我都建议使用with,因为它使代码更容易阅读。

更新:这种性能上的差异是由这样一个事实解释的:写入是高度缓冲的,并且在实际发生写入磁盘之前返回(参见这个答案),而打印(可能)使用行缓冲。对此的一个简单测试是检查长写入的性能,这样行缓冲的缺点(就速度而言)就不那么明显了。

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

现在,性能差异变得不那么明显了,写入的平均时间为2.20秒,打印的平均时间为3.10秒。如果需要连接一堆字符串来获得这种长行性能将受到影响,因此打印效率更高的用例有点少见。

当你说行,它是指一些以“\n”字符结尾的序列化字符。行应该在最后一点,所以我们应该在每行的末尾考虑'\n'。下面是解决方案:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write("Hello")

在追加模式下,每次写入后光标移动到新行,如果你想使用w模式,你应该在write()函数的末尾添加\n个字符:

the_file.write("Hello\n")

我认为没有“正确”的方法。

我会用:

with open('myfile', 'a') as f:
    f.write('hi there\n')

为了纪念蒂姆·托迪。

当我需要大量编写新行时,我定义了一个使用print函数的lambda:

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

这种方法的好处是它可以利用打印函数的所有可用特性。

更新:正如Georgy在评论区提到的,可以通过partial函数进一步改进这个想法:

from functools import partial
fwl = partial(print, file=out)

恕我直言,这是一种更实用、更简单的方法。

python文档推荐这样做:

with open('file_to_write', 'w') as f:
    f.write('file contents\n')

所以这是我通常做的方式:)

docs.python.org声明:

在处理文件时使用'with'关键字是一个很好的实践 对象。这样做的好处是文件在关闭后被正确关闭 它的套件结束了,即使在此过程中引发了异常。它是 也比编写等价的try-finally块要短得多。