Python写入在Windows中用“\ n \ n”取代“\ n”

时间:2017-11-20 03:24:36

标签: windows python-3.x read-write

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

当我将"\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'

以更有条理的方式:

| Method of Writing | Method of Reading | "\n" Turns Into |
|-------------------|-------------------|-----------------|
| "w"               | "r"               | "\n"            |
| "w"               | "rb"              | b"\r\n"         |
| "wb"              | "r"               | "\n"            |
| "wb"              | "rb"              | b"\n"           |

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

修改 这对于pandas库来说尤其成问题,pandas库似乎将DataFrame写入csv "w"并使用csv"rb"。请参阅顶部链接的问题以获取此示例。

2 个答案:

答案 0 :(得分:1)

来自the documentation

  

换行符控制通用换行模式的工作方式(仅适用于文本模式)。它可以是None'''\n''\r''\r\n'。它的工作原理如下:

     

[...]

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

答案 1 :(得分:1)

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

  

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

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

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