为什么Python file.write()会意外地在每一行中添加一个换行符?

为什么Python file.write()会意外地在每一行中添加一个换行符?,python,string,file,newline,Python,String,File,Newline,我想在循环期间将字符串写入文件: with open("dump.txt", "w+") as file: for x in range(1, 10): file.write(str(x) + "\r\n") 如果我在Windows上的记事本中打开dump.txt,我会得到我想要的: 1 2 3 4 5 6 7 8 9 我必须在每行末尾添加\r\n,否则我会得到123456789(所有数字都在一行中) 当我在

我想在循环期间将字符串写入文件:

with open("dump.txt", "w+") as file:
    for x in range(1, 10):
        file.write(str(x) + "\r\n")
如果我在Windows上的记事本中打开
dump.txt
,我会得到我想要的:

1
2
3
4
5
6
7
8
9
我必须在每行末尾添加
\r\n
,否则我会得到
123456789
(所有数字都在一行中)

当我在记事本++中检查我的
dump.txt
时,我可以看到我在每行后面都有一个额外的CRLF:

1 CRLF
CRLF
2 CRLF
CRFL
etc.
当我将
dump.txt
读回python并循环遍历文件时,额外的LF被输出:

import sys

with open("dump.txt", "r") as infile:
    for line in infile:
         sys.stdout.write(line)

C:\...\Python\Python38-32\python.exe C:/.../script.py
1

2

3
如果我在Windows上使用记事本创建一个新文件,只需输入数字1到9,在每行后面按enter键,python就会正确地读入该文件。在Notepad++中,我也看不到任何额外的CRLF字符

import sys 

with open("dump2.txt", "r") as infile:
    for line in infile:
         sys.stdout.write(line)

C:\...\Python\Python38-32\python.exe C:/.../script2.py
1
2
3
...
9
我的问题是:我错过了什么?Python似乎为每个file.write()添加了第二个CRLF,但前提是要写入的字符串已经以
“\r\n”
结尾。这是一种非常奇怪的行为

我想逐行编写字符串,以显式“\r\n”结尾,或者更好地以运行脚本的平台的EOL字符结尾,就像我刚刚使用记事本手动创建了一个txt文件一样


非常感谢你的帮助

CRLF在Notepad++中表示“回车”,在Python中表示
\r
。如果您想在写入时删除它们,那么只需将它们改为
\n

Python使用从C继承的约定,即换行符在内部始终是单个LF(有时写为\n),而不管平台约定是什么。在默认的文本模式下打开文件时,数据在写入/读取时自动转换为平台标准

你在Windows上,这里的行尾约定是CR+LF。当您写入'\r\n'(即CR+LF)时,将转换为CR+CR+LF。当你读回这篇文章时,CR+LF对被转换成LF,“孤立”CR:s也被转换成LF:s


要阅读更多内容,请从开始并按照链接进行操作。

那么,您是说您在文件中写入了重复的行尾,但记事本中没有显示这些内容?我很难相信这一点。在任何情况下,
repr()
都是您的朋友或调试器。行中没有“第二个CRLF”这样的东西。如果您有一个确实包含此类内容的文件,则该文件将在包含数据的每一行之后呈现为一个单独的空行。Coderman1234的回答成功了。我认为“\r\n”毕竟是两个独立的字符。记事本(Win)将其解释为1个换行符,而python将其解读为2个单独的换行符。当我将“\r\n”替换为“\n”时,一切正常。