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

print >>f, "hi there"

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


当前回答

关于os.linesep:

下面是一个在Windows上精确的未经编辑的Python 2.7.1解释器会话:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

在Windows上:

不出所料,os。linesep不会产生与'\n'相同的结果。它不可能产生同样的结果。'hi there' + os。linesep等价于'hi there\r\n',它并不等价于'hi there\n'。

很简单:使用\n,它会自动转换为os.linesep。自从第一次将Python移植到Windows以来,就一直如此简单。

使用os没有任何意义。linesep在非Windows系统上,它在Windows上产生错误的结果。

不要使用os.linesep!

其他回答

如果您希望避免使用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”)。

在Python 3中,它是一个函数,但在Python 2中,你可以将它添加到源文件的顶部:

from __future__ import print_function

然后你做了

print("hi there", file=f)

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

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

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

the_file.write("Hello\n")

你也可以试试文件编辑器

PIP安装文件写入器

from filewriter import Writer

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

写入my_file.txt

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

您应该使用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教程