为什么多行字符串在打印或写入时被更改?(Windows上的Python 3.6)

为什么多行字符串在打印或写入时被更改?(Windows上的Python 3.6),python,windows,python-3.x,newline,multiline,Python,Windows,Python 3.x,Newline,Multiline,我正在Windows上使用Python 3.6.3。 当我尝试将单个多行字符串打印到文件时,如下所示: with open('test1.txt', mode='w') as f: f.write('test\r\ntest\r\n') 然后test1.txt将包含test\r\r\ntest\r\n,而不是test\r\ntest\r\n 获得所需输出的解决方案如下所示: with open('test2.txt', mode='w') as f: for line in '

我正在Windows上使用Python 3.6.3。 当我尝试将单个多行字符串打印到文件时,如下所示:

with open('test1.txt', mode='w') as f:
    f.write('test\r\ntest\r\n')
然后
test1.txt
将包含
test\r\r\ntest\r\n
,而不是
test\r\ntest\r\n

获得所需输出的解决方案如下所示:

with open('test2.txt', mode='w') as f:
    for line in 'test\r\ntest\r\n'.splitlines():
        print(line, file=f)

为什么会发生这种情况?

事实证明,正确地陈述一个问题往往会导致答案出现:

这种行为的原因可以在Python中找到(引用自
TextIOWrapper
):

在输出时,如果
换行符
,则写入的任何
'\n'
字符将转换为系统默认的行分隔符
os.linesep
如果换行符是
,则不会进行转换。如果换行符是任何其他合法值,则写入的任何
'\n'
字符都将转换为给定字符串。(请注意,指导翻译的规则对于输出和输入是不同的。)

这意味着,当打开文件进行写入时,
换行符
参数可以设置为
'
,以获得所需的输出:

with open('test3.txt', mode='w', newline='') as f:
    f.write('test\r\ntest\r\n')

你不应该把
\r
放在自己身上。文本模式为你翻译。是的,我知道我不应该这么做。在我的例子中,我一次就从
tablib.tsv
中获得了字符串。但是,如果您希望数据按字面形式写入,为什么要用
mode='w'
而不是
mode='wb'
?我想这也可以做到。。。是否存在
mode='wb'
不能很好地处理字符串的情况?