何时以二进制模式打开文件(b)?

Cel*_*tas 11 python file-io

我注意到在文档中他们总是用'wb'打开一个CSV文件.为什么'b'?我知道b代表二进制模式,但是你什么时候使用二进制模式(我猜想CSV文件不是二进制模式).如果相关我是从arcpy.da.SearchCursor()查询的结果写入CSV

编辑:刚才注意到根据这个答案 wb+用于编写二进制文件.包括+做什么?

小智 6

文件打开默认使用文本模式,这可能会在写入时将 \'\\n\' 字符转换为特定于平台的表示形式,并在读取时返回。

\n\n

在 Windows 中,这会将换行符从 \'\\n\' 修改为 \'\\r\\n\',这将导致在其他应用程序/平台中打开 CSV 文件时出现问题。

\n\n

因此,在打开二进制文件时,应在模式值后附加“b”以二进制模式打开文件,这将提高可移植性。在不\xe2\x80\x99t 有这种区别的系统上,添加\'b\' 没有效果。

\n\n

注意:\'w+\' 会截断文件。

\n\n

模式“r+”、“w+”和“a+”打开文件进行更新(读取和写入)。

\n\n

详细信息如下: https: //docs.python.org/2/library/functions.html#open

\n


jfs*_*jfs 6

使用'b'模式,无需任何转换即可按原样读取/写入二进制数据,例如,将换行符转换为特定于平台的值或从特定于平台的值转换换行或使用字符编码对文本进行解码/编码。

csv模块很特殊。CSV数据是文本,因此文本模式将被预期,但csv模块使用'\r\n'的所有平台默认情况下终止行,它总是同时识别'\r''\n'为新行。如果您以文本模式(带有通用换行符)打开相应的文件,那么您将'\r\r\n'在Windows(os.linesep == '\r\n'那里)上获得(损坏的换行符)。这就是为什么Python 2文档说您必须使用二进制模式。在Python 3中,使用文本模式,但是您应该通过newline=''禁用通用换行模式。如果要保留'\r'嵌入在字段中的可能的换行符(例如),则还需要禁用通用换行符。


wal*_*lyk 1

通过t在非 Posix 环境(如 MSDOS 和 MS Windows)上使用,\r\n序列将被转换为\n输入(以及输出上的相反)。 b(二进制模式)不执行此类转换。

据推测,CSV 库会处理回车符(可能会在遇到回车符时忽略它们)。


编辑:刚刚注意到一个改变的问题。

由于 .CSV 文件并不是真正适合人类读者,因此该库只能使用\n(换行符 (LF) 又名换行符)分隔符输出它们。它们唯一真正的缺点是 MSWindows 用户用记事本打开文件:它的显示效果很差。CSV 库还可以输出带有\r\n(CR LF) 的文件,因为大多数程序都反对 MSDOS 文本文件约定。

无论哪种方式,库都可以通过b(二进制)模式写入。如果以t(文本)模式打开,行分隔符可能会有点奇怪,例如\r\n\n. 可能大多数 CSV 文件解析器都会忽略 CR,并将 LF LF 识别为行结束符,并在其后面跟随一个空行,它也会忽略该行。

手册页+中对此进行了解释:

w+      打开以进行读取和写入。如果文件不存在则创建该文件,否则将被截断。该流位于文件的开头。

区别在于w+允许读和写w允许写。