Python Write 在 Windows 中将“\n”替换为“\r\n”

don*_*234 10 windows read-write python-3.x

这里查看我的问题后,我发现它是由一个更简单的问题引起的。

当我写入"\n"文件时,我希望"\n"从文件中读入。在 Windows 中并非总是如此。

In [1]: with open("out", "w") as file:
   ...:     file.write("\n")
   ...:

In [2]: with open("out", "r") as file:
   ...:     s = file.read()
   ...:

In [3]: s  # I expect "\n" and I get it
Out[3]: '\n'

In [4]: with open("out", "rb") as file:
   ...:     b = file.read()
   ...:

In [5]: b  # I expect b"\n"... Uh-oh
Out[5]: b'\r\n'

In [6]: with open("out", "wb") as file:
   ...:     file.write(b"\n")
   ...:

In [7]: with open("out", "r") as file:
   ...:     s = file.read()
   ...:

In [8]: s  # I expect "\n" and I get it
Out[8]: '\n'

In [9]: with open("out", "rb") as file:
   ...:     b = file.read()
   ...:

In [10]: b  # I expect b"\n" and I get it
Out[10]: b'\n'
Run Code Online (Sandbox Code Playgroud)

以更有条理的方式:

| Method of Writing | Method of Reading | "\n" Turns Into |
|-------------------|-------------------|-----------------|
| "w"               | "r"               | "\n"            |
| "w"               | "rb"              | b"\r\n"         |
| "wb"              | "r"               | "\n"            |
| "wb"              | "rb"              | b"\n"           |
Run Code Online (Sandbox Code Playgroud)

当我在我的 Linux 虚拟机上尝试这个时,它总是返回 \n。如何在 Windows 中执行此操作?

编辑: 这对于 pandas 库尤其成问题,它似乎将DataFrames写入csvwith"w"并读取csvs with "rb"。有关此示例,请参阅顶部链接的问题。

Mad*_*ist 7

由于您使用的是 Python 3,因此您很幸运。当您打开文件进行写入时,只需指定newline='\n'以确保它写入'\n'而不是系统默认值,即\r\n在 Windows 上。从文档

将输出写入流时,如果newlineNone,则'\n'写入的任何字符都将转换为系统默认行分隔符os.linesep。如果换行符是'''\n',则不进行翻译。如果newline是任何其他合法值,则'\n'写入的任何字符都将转换为给定的字符串。

您认为“有时”会看到两个字符的输出的原因是,当您以二进制模式打开文件时,根本没有进行任何转换。为方便起见,字节数组仅以 ASCII 显示。在解码之前不要将它们视为真正的字符串。您显示的二进制输出是所有示例中文件的真实内容。

当您以默认文本模式打开文件进行读取时,该newline参数的工作方式与写入时的工作方式类似。默认情况下\r\n,文件中的所有内容都将\n在字符解码后立即转换为。当您的代码在操作系统之间传输但您的文件不传输时,这非常好,因为您可以使用完全相同的代码,仅依赖于\n. 如果您的文件也在旅行,那么您应该newline='\n'至少在输出方面坚持使用相对便携的方式。