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

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

如果有任何非ascii字符你应该使用二进制模式...在二进制模式下打开将永远不会改变或损害你的数据afaik,但有时打开ascii模式将删除或更改字符...因此我总是打开 二进制模式(即使使用ascii数据)

@JoranBeasley:没有"ascii模式"这样的东西。 改为使用术语"文本模式"(文本文件的字符编码可以是任何东西)。

阅读您已链接的问题的答案 - +表示您希望同时写入和从文件中读取。

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

csv模块很特别。 csv数据是文本,因此可以预期文本模式,但csv模块默认使用'

'来终止所有平台上的行,并且它始终将'

'和'

'都识别为换行符。 如果您在文本模式下打开相应的文件(使用通用换行符),那么您将在Windows上获得'

'(损坏的换行符)(os.linesep == '

')。 这就是Python 2文档说你必须使用二进制模式的原因。 在Python 3中,使用了文本模式,但是您应该传递newline=''以禁用通用换行模式。

如果要保留字段中嵌入的可能换行符(例如'

'),您还需要禁用通用换行符。

要挑剔,传递newline=不会禁用通用换行模式。从文档:"如果是,启用通用换行模式,但行结尾返回给调用者未翻译。"

文件打开默认是使用文本模式,它可以在写入时将" n"字符转换为特定于平台的表示,并在读取时返回。

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

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

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

模式'r +','w +'和'a +'打开文件进行更新(读写)。

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

什么是"截断"文件,是否意味着替换?

相反。文本模式提高了代码的可移植性(您可以读取在其他平台上编写的文本,本地编写的文件可以通过特定于平台的程序(如notepad.exe)来理解)。 csv是一种特殊情况,其中二进制模式用于文本数据

截断表示如果文件不存在则会创建该文件,如果文件存在则会被覆盖。所以是的,简单来说就意味着取代。

我同意,"文本模式增加了可移植性,而csv只是一种特殊情况,其中二进制模式用于文本数据"。

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

If csvfile is a file object, it must be opened with the ‘b’ flag on platforms where that makes a difference.

资料来源:https://docs.python.org/2.7/library/csv.html#csv.reader

由于在文本模式下打开文件会根据操作系统对核心代码的处理方式进行不同的处理,因此CVS例程作者必须确定他们需要更多控制 - 他们更愿意自己处理换行。这可能使他们能够解决在另一个操作系统上创建的一个操作系统下处理文件时遇到的不一致问题 - 在某些特殊情况下,"文本读取"会改变问题。它也可能没有发现错误,但他们希望避免未来的可能性。或者,也可能是因为他们不得不处理换行注意事项,绕过文本处理可能会更快。

从逻辑上讲,由于无法控制正在读取的文件的OS源,因此使用二进制文件可能是更好的方法。但是,编写一个文本文件可能会很好地将其留给核心例程来使用文本模式处理当前操作系统的换行符。

在python文件模式"w +"的困惑中讨论了"+"

我从来没有收到过关于为什么我不能在二进制模式下打开ascii文件的好解释。

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

我已经看到以ascii模式打开文件,改变或损坏正在检索的数据,我和我认为大多数经验丰富的python程序员都会以二进制模式打开文件,除非我们有某种保证,没有,也永远不会文件中的二进制字符。

要理解原因,请写open(binary.txt, wb).write(b"1

2

3

")和open(text.txt, w).write("1

2

3

")并尝试在notepad.exe中打开这两个文件

因为notepad.exe太笨了以至于无法识别 n作为换行符,当它没有前面时 r n对我来说不是一个很好的理由...如果我写" n"我希望该文件只包含 n。 ..

通过在非Posix环境(如MSDOS和MS Windows)上使用t,

序列在输入时转换为(在输出上转换为相反的)。 b(二进制模式)不执行此类转换。

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

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

由于.CSV文件并非真正供人类读者使用,因此库只能使用(换行(LF)又名换行)分隔符输出它们。他们唯一真正的缺点是MSWindows用户用记事本打开文件:它会显示不佳。 CSV库还可以输出带有

(CR LF)的文件,因为大多数程序都符合MSDOS文本文件约定。

无论哪种方式,库都可以通过b(二进制)模式编写。如果在t(文本)模式下打开,行分隔符可能会像

那样略微奇怪。可能大多数CSV文件解析器忽略CR,并将LF LF识别为结束一行并跟随一条空(空白)行,它也会忽略。

手册页中解释了+:

w+ Open for reading and writing. The file is created if it does

not exist, otherwise it is truncated. The stream is

positioned at the beginning of the file.

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

可能通过使用它们作为行分隔符()...但是很好的答案

是否在文本模式下翻译取决于平台(os.linesep)。它在Windows上。它不适用于OS X.您不需要显式使用t模式(它在Python 2上传递给stdio函数,因此它可以启用与平台相关的行为,例如将Ctrl + Z识别为输入上的EOF字符)。 csv模块始终在输入时识别 r和 n

python2打开文件_关于python:何时以二进制模式打开文件(b)?相关推荐

  1. python能不能用c打开文件_C/C++/Python等 使用二进制模式打开文件与不使用二进制模式的区别...

    C语言中文本文件与二进制文件的区别 一.文本文件与二进制文件的定义 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的.这两者只是在编码层次上有差异. ...

  2. c++ 写入文件_利用Python把数据存储在csv文件中

    鼠年第一天开盘,很多股票跌停,太闹心了!今天再找点开心的事情做吧.人生最幸福的事情莫过于看到自己写的程序调试通过了! 前面我们介绍了,如何用Python做一个串口通讯的上位机.用这个上位机我们可以从E ...

  3. python打开文件_用Python(in PsychoPy)打开SPSS数据文件

    用Python(in PsychoPy)打开SPSS数据文件 有时,要访问SPSS的sav文件中的内容,而手里电脑没有SPSS软件,或者需要对SPSS数据文件中的数据进行SPSS支持不够好的操作,如对 ...

  4. python autoit上传文件_结合python+selenium使用AutoIt V3实现文件、图片上传

    1.下载.安装AutoIt V3 下载官网:https://www.autoitscript.com/site/autoit/downloads/ 2.AutoIt V3组件介绍 AutoIt Win ...

  5. python不解压直接提取文件_用python不解压的读取bz2文件和gz文件

    当一个文档特别大的时候(比如wikidata等知识库的dump),往往会采用bz2或者gz对其进行压缩,方便下载,同时减少存储空间(bz2压缩率更高一些). 那么,如何不用解压也能读取原来的文档呢? ...

  6. python逐个读取文件_在Python中多次读取同一文件

    我需要下载文本文件的zip存档,将存档中的每个文本文件分发给其他处理程序进行处理,最后将解压缩的文本文件写入磁盘. 我有以下代码.它在同一个文件上使用多个打开/关闭,这看起来并不优雅.如何让它更优雅高 ...

  7. python如何自动读取excel文件_基于Python的接口自动化-读写excel文件

    引言 使用python进行接口测试时常常需要接口用例测试数据.断言接口功能.验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来 ...

  8. 用python恢复删除的文件_使用python删除N天前的文件

    python版本为:2.7 import os import sys import time # Sets how many days old files are deleted DAYS_N = 7 ...

  9. python通过内置的什么函数打开一个文件_利用python进行文件操作

    这篇文章主要介绍了如何利用python进行文件操作,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 什么是文件 文件是系统存储区域的一个命名位置,用来存储一些信息,便于后续访问.能够在非 ...

最新文章

  1. 12306系统的秒杀“艺术”:如何抗住100万人同时抢1万张票?
  2. php变量类型怎么表示,PHP 数据类型_php
  3. hadoop之MapReduce自定义二次排序流程实例详解
  4. 说说设计模式~组合模式(Composite)
  5. 警告!你的Python代码命名太烂了,命令你熟读本篇迷你命名指南!
  6. php简单网站源码包含数组_PHP无限分级阶梯递归数组排列 以及多层嵌套数组在网页中的解析源码...
  7. 【Python-2.7】if-elif-else
  8. vue.js高德地图实现热点图
  9. c++ 结构体中不同类型的初始值_不同类型结构的厂房效果图大盘点
  10. poj 1887 Testing the CATCHER dp 最大降序
  11. 怎样设置rotacast插件_Revit插件|提取地形图上地形小插件(感觉一般,可以试试)...
  12. Hive 建表语句详解
  13. java贴图技术坦克世界_坦克世界游戏图像设置技巧 如何提高FPS
  14. 计算机粘贴复制知识,不能复制粘贴怎么办?Win7电脑不能复制粘贴是什么原因及解决方法...
  15. 蓝桥杯_练一练「鲁卡斯队列」 java
  16. 【博客之星】坚持,是一种信仰
  17. Java 使用poi-tl下载Word
  18. 安装前端编辑器HBuilderX
  19. 基于局域网的超简易即时通讯软件(二)
  20. 国标GB28181漫谈

热门文章

  1. apache lucene_Apache Lucene基础教程
  2. jgit_JGit身份验证说明
  3. 具有PreAuthorize的Spring方法安全性
  4. jpa和hibernate_使用JPA和Hibernate有效删除数据
  5. spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建
  6. usb端点轮询_使用Spring Integration轮询http端点
  7. 什么是javax.ws.rs.core.context? [ 第2部分 ]
  8. 5个构建Spring Boot API的实用技巧
  9. 在Elasticsearch中索引Java Bean的简单方法
  10. 数据聚合Spring Data MongoDB:嵌套结果