为什么多行string在打印或写入时被改变? (Windows上的Python 3.6)

我在Windows上使用Python 3.6.3。 当我尝试打印一个多行string文件是这样的:

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

然后test1.txt将包含test\r\r\ntest\r\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上的PEP 3116 ):

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

这意味着,在打开文件进行写入时,可以将newline参数设置为''来实现所需的输出:

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