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

Python 何时以二进制模式(b)打开文件?,python,file-io,Python,File Io,我注意到他们总是打开一个带有“wb”的CSV文件。为什么是“b”?我知道b代表二进制模式,但什么时候使用二进制模式(我猜CSV文件不是二进制的)。如果相关,我正在从arcpy.da.SearchCursor()查询的结果写入CSV 编辑:刚刚注意到根据wb+用于编写二进制文件。包含+的功能是什么?通过在非Posix环境(如MSDOS和MS Windows)上使用t,\r\n序列在输入时转换为\n(在输出时则相反)b(二进制模式)不执行此类转换 CSV库可能处理回车(可能在遇到回车时忽略回车)

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


编辑:刚刚注意到根据
wb+
用于编写二进制文件。包含
+
的功能是什么?

通过在非Posix环境(如MSDOS和MS Windows)上使用
t
\r\n
序列在输入时转换为
\n
(在输出时则相反)<代码>b(二进制模式)不执行此类转换

CSV库可能处理回车(可能在遇到回车时忽略回车)


编辑:刚刚注意到一个已更改的问题

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

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

+
的解释如下:

w+打开阅读和写作。如果创建了该文件,则会创建该文件 不存在,否则将被截断。这条小溪很深 位于文件的开头


区别在于
w+
允许读写,而
w
只允许写。

我从来没有收到过一个很好的解释,解释为什么我不应该以二进制模式打开ascii文件

我从未见过以二进制模式打开文件来破坏数据


我见过以ascii模式打开文件,改变或损坏正在检索的数据,因此,我和我假设大多数经验丰富的python程序员一般都会以二进制模式打开文件,除非我们能保证文件中不会也永远不会有二进制字符。

因为以文本模式打开文件会根据操作系统的核心代码以不同方式释放对换行符的处理,CVS例程的作者们肯定已经确定他们想要更多的控制——他们更愿意自己处理换行符。这可能使他们能够解决在一个操作系统下处理在另一个操作系统上创建的文件时遇到的不一致问题——在某些特殊情况下,“文本读取”会有问题地改变事情。也可能没有发现任何bug,但他们希望避免将来的可能性。或者,也可能是因为他们无论如何都要处理换行,所以绕过文本处理可能会更快

从逻辑上讲,由于无法控制正在读取的文件的操作系统源,因此通常使用二进制可能是更好的方法。然而,编写一个文本文件时最好让核心例程使用文本模式处理当前操作系统的换行


“+”在

文件打开中讨论,默认情况下使用文本模式,该模式可在写入和读取时将“\n”字符转换为特定于平台的表示形式

在windows中,这将修改从“\n”到“\r\n”的换行符,这将在其他应用程序/平台中打开CSV文件时产生问题

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

注意:“w+”将截断该文件

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


正如这里所详述的:

对于Python
csv
模块,答案很简单:这是文档所要求的

如果
csvfile
是一个文件对象,则必须在有区别的平台上使用“b”标志打开它


来源:

使用
'b'
模式,在不进行任何转换的情况下读取/写入二进制数据,例如将换行符转换为平台特定值或使用字符编码对文本进行解码/编码

csv
模块是特殊的。csv数据是文本,因此应使用文本模式,但默认情况下,
csv
模块使用
'\r\n'
终止所有平台和服务器上的行。如果以文本模式(使用)打开相应的文件,则将在Windows上获得
'\r\n'
(损坏的换行符)(
os.linesep='\r\n'
)。这就是为什么Python2文档说必须使用二进制模式。在Python3中,使用了文本模式,但应该传递
newline='
以禁用该模式。
如果要保留字段中可能嵌入的换行符(如
'\r'
),还需要禁用通用换行符。

如果存在任何非ascii字符,则应使用二进制模式。。。以二进制模式打开将永远不会改变或损害您的数据,但有时以ascii模式打开将删除或更改字符。。。因此,我总是以二进制模式打开(即使使用ascii数据)@JoranBeasley:没有“ascii模式”这样的东西。改为使用术语“文本模式”(文本文件的字符编码可以是任何内容)。读取--
+
的答案意味着您既要写入文件,也要从文件中读取。可能将它们用作行分隔符(
\n
)。。。很好的回答,不管是否以文本模式翻译
“\r\n”
,都是platfo