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

print >>f, "hi there"

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


当前回答

如果您希望避免使用write()或writelines()并自己用换行符连接字符串,则可以将所有行传递给print(),并将换行分隔符和文件句柄作为关键字参数。这个代码片段假设字符串没有结尾换行符。

print(line1, line2, sep="\n", file=f)

你不需要在结尾放一个特殊的换行符,因为print()为你做了。

如果列表中有任意数量的行,可以使用列表展开将它们全部传递给print()。

lines = ["The Quick Brown Fox", "Lorem Ipsum"]
print(*lines, sep="\n", file=f)

在Windows上使用“\n”作为分隔符是可以的,因为print()也会自动将其转换为Windows CRLF换行符(“\r\n”)。

其他回答

从3.5开始,你也可以使用pathlib来实现这个目的:

路径。write_text(data, encoding=None, errors=None) 以文本模式打开指向的文件,向其写入数据,然后关闭文件:

import pathlib

pathlib.Path('textfile.txt').write_text('content')

如果你要写很多数据,而且速度很重要,你可能应该使用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秒。如果需要连接一堆字符串来获得这种长行性能将受到影响,因此打印效率更高的用例有点少见。

你也可以试试文件编辑器

PIP安装文件写入器

from filewriter import Writer

Writer(filename='my_file', ext='txt') << ["row 1 hi there", "row 2"]

写入my_file.txt

接受一个可迭代对象或具有__str__支持的对象。

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

我会用:

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

为了纪念蒂姆·托迪。

您应该使用print()函数,该函数自Python 2.6+以来可用

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

对于Python 3,您不需要导入,因为print()函数是默认的。

Python 3中的替代方法是使用:

with open('myfile', 'w') as f:
    f.write('hi there\n')  # python will convert \n to os.linesep

引用自Python文档中关于换行符的内容:

当写入输出到流时,如果newline为None,则写入的任何'\n'字符都将转换为系统默认的行分隔符os.linesep。如果换行符为''或'\n',则不进行转换。如果newline是任何其他合法值,则写入的任何'\n'字符都将转换为给定的字符串。

参见:读取和写入文件- Python教程