【问题标题】:Why does Python file.write() unexpectedly add a newline to every line?为什么 Python file.write() 会意外地在每一行添加一个换行符?
【发布时间】:2023-03-16 17:31:01
【问题描述】:

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

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(所有数字都在一行中)。

当我在 Notepad++ 中检查我的 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,在每行后按回车,python 会正确读取它。在记事本++中,我也看不到任何额外的 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 文件使用记事本..

非常感谢您的帮助!

【问题讨论】:

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

标签: python string file newline


【解决方案1】:

记事本++中的CRLF表示“回车”,或者在Python中表示\r。如果您想在写入时删除它们,则只需输入\n

【讨论】:

    【解决方案2】:

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

    您在 Windows 上,行尾约定是 CR+LF。当您编写 '\r\n'(即 CR + LF)时,它会转换为 CR + CR + LF。当你读回来时,CR+LF 对被转换为 LF,而“单独”的 CR:s 也被转换为 LF:s!

    如需更多阅读,请从documentation for the openfunction 开始并点击链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多