在查看我的问题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"
。请参阅顶部链接的问题以获取此示例。
答案 0 :(得分:1)
换行符控制通用换行模式的工作方式(仅适用于文本模式)。它可以是
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:
将输出写入流时,如果
newline
为None
,则写入的任何'\n'
个字符都将转换为系统默认行分隔符os.linesep
。如果换行符为''
或'\n'
,则不会进行翻译。如果newline
是任何其他合法值,则写入的任何'\n'
个字符都将转换为给定字符串。
您认为“有时”看到双字符输出的原因是当您以二进制模式打开文件时,根本不会进行任何转换。为方便起见,只要可能,就会以ASCII格式显示字节数组。在解码之前不要将它们视为真正的字符串。您显示的二进制输出是所有示例中文件的真实内容。
当您在默认文本模式下打开文件进行阅读时,newline
参数的工作方式与写入方式类似。默认情况下,在解码字符后,文件中的所有\r\n
都将转换为\n
。当您的代码在操作系统之间移动但是您的文件没有,因为您可以使用仅依赖于\n
的完全相同的代码,这是非常好的。如果您的文件也是如此,那么至少应该输出相对便携的newline='\n'
。