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"。有关此示例,请参阅顶部链接的问题。
由于您使用的是 Python 3,因此您很幸运。当您打开文件进行写入时,只需指定newline='\n'以确保它写入'\n'而不是系统默认值,即\r\n在 Windows 上。从文档:
将输出写入流时,如果
newline是None,则'\n'写入的任何字符都将转换为系统默认行分隔符os.linesep。如果换行符是''或'\n',则不进行翻译。如果newline是任何其他合法值,则'\n'写入的任何字符都将转换为给定的字符串。
您认为“有时”会看到两个字符的输出的原因是,当您以二进制模式打开文件时,根本没有进行任何转换。为方便起见,字节数组仅以 ASCII 显示。在解码之前不要将它们视为真正的字符串。您显示的二进制输出是所有示例中文件的真实内容。
当您以默认文本模式打开文件进行读取时,该newline参数的工作方式与写入时的工作方式类似。默认情况下\r\n,文件中的所有内容都将\n在字符解码后立即转换为。当您的代码在操作系统之间传输但您的文件不传输时,这非常好,因为您可以使用完全相同的代码,仅依赖于\n. 如果您的文件也在旅行,那么您应该newline='\n'至少在输出方面坚持使用相对便携的方式。
| 归档时间: |
|
| 查看次数: |
5193 次 |
| 最近记录: |