我注意到the docs他们总是用'wb'打开一个CSV文件。为什么'b'?我知道b代表二进制模式,但是你什么时候使用二进制模式(我猜想CSV文件不是二进制模式)。如果相关,我将根据arcpy.da.SearchCursor()
的查询结果写入CSV编辑:根据this answer wb+
注意到用于编写二进制文件。包括+
做了什么?
答案 0 :(得分:5)
使用'b'
模式,按原样读取/写入二进制数据,无需进行任何转换,例如将换行符转换为特定于平台的值或从特定于平台的值转换或使用字符编码解码/编码文本。
csv
模块很特别。 csv数据是文本,因此可以使用文本模式,但csv
模块默认使用'\r\n'
来终止所有平台上的行和it always recognizes both '\r'
and '\n'
as newlines。如果您在文本模式下打开相应的文件(使用universal newlines),那么您将在Windows上获得'\r\r\n'
(损坏的换行符)(os.linesep == '\r\n'
那里)。这就是Python 2文档说你必须使用二进制模式的原因。在Python 3中,使用了文本模式,但您应该将newline=''
传递给禁用universal newlines模式。
如果要保留字段中嵌入的可能换行符(例如'\r'
),您还需要禁用通用换行符。
答案 1 :(得分:2)
文件打开默认设置是使用文本模式,可以转换' \ n'在写作和回读时的字符特定表示。
在Windows中,这会修改来自' \ n'的换行符。到' \ r \ n'这会在其他应用程序/平台中打开CSV文件时出现问题。
因此,在打开二进制文件时,您应该附加' b'到模式值以二进制模式打开文件,这将提高可移植性。在没有这种区别的系统上,添加' b'没有效果。
注意:' w +'截断文件。
模式' r +',' w +'和' a +'打开文件进行更新(读写)。
答案 2 :(得分:0)
在非Posix环境(如MSDOS和MS Windows)上使用t
,\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
允许阅读和,而#ifndef _OBJECT_H_
#define _OBJECT_H_
#include <iostream>
#include <functional>
namespace core {
class Object {
protected:
template <>
struct std::hash<core::Object>
{
size_t operator()(const core::Object &x) const = 0;
};
public:
virtual Object* clone() = 0;
virtual int hashCode() = 0;
virtual std::string getClass() = 0;
virtual ~Object();
};
}
#endif
只允许写作。
答案 3 :(得分:0)
我从来没有收到过关于为什么我不能在二进制模式下打开ascii文件的好解释。
我从未见过以二进制模式打开文件来破坏数据。
我已经看到以ascii模式打开文件,更改或损坏正在检索的数据,我和我认为大多数经验丰富的python程序员都会以二进制模式打开文件,除非我们有某种保证没有和永远不会是文件中的二进制字符。
答案 4 :(得分:0)
由于在文本模式下打开文件会根据操作系统将新行的处理方式降级为核心代码,因此CVS例程作者必须确定他们需要更多控制权 - 他们更愿意自己处理换行符。这可能使他们能够解决在另一个操作系统上创建的一个操作系统下处理文件时遇到的不一致问题 - 在某些特殊情况下,“文本读取”会改变问题。它也可能没有发现错误,但他们希望避免未来的可能性。或者,也可能是因为他们不得不处理换行注意事项,绕过文本处理可能会更快。
逻辑上,由于无法控制正在读取的文件的OS源,因此使用二进制文件可能是更好的方法。但是,编写一个文本文件可能会很好地将其留给核心例程来使用文本模式处理当前操作系统的换行符。
讨论了“+”答案 5 :(得分:0)
对于Python csv
模块,答案很简单:文档要求它。
如果
csvfile
是一个文件对象,那么它必须在平台上以“b”标志打开,这会产生影响。