草庐IT

python - Windows上python中二进制和文本I/O的区别

coder 2023-05-26 原文

我知道我应该使用 "rb" 而不是 "r" 打开二进制文件,因为 Windows 对二进制文件和非二进制文件的行为不同。

但我不明白如果我以错误的方式打开文件会发生什么,以及为什么这种区分是必要的。其他操作系统似乎可以通过将这两种文件同等对待。

最佳答案

这是出于历史原因(或者我喜欢说,歇斯底里)。文件打开模式继承自 C stdio 库,因此我们遵循它。

对于 Windows,文本和二进制文件之间没有区别,就像在任何 Unix 克隆中一样。不,我是认真的! - 有(有)文件系统/操作系统,其中文本文件与目标文件完全不同,等等。在某些情况下,您必须提前指定行的最大长度并使用固定大小的记录......来自 80 列纸质穿孔卡片等时代的化石。幸运的是,在 Unices、Windows 和 Mac 中并非如此。

但是 - 所有其他条件都相同 - Unix、Windows 和 Mac 历史上 在输出流中使用哪些字符来标记一行的结尾(或者,同样的东西,作为行之间的分隔符)不同。在 Unix 中,使用\x0A (\n)。在 Windows 中,使用两个字符的序列\x0D\x0A (\r\n);在 Mac 上 - 只需\xOD (\r)。以下是关于这两个符号的使用起源的一些线索 - ASCII 代码 10 被称为 换行 (LF),当发送到电传打字机时,会导致它向下移动一行 (Y++),没有改变其水平 (X) 位置。 回车 (CR) - ASCII 13 - 另一方面,将导致打印回车返回到行首 (​​X=0) 而无需向下滚动一行。因此,在向打印机发送输出时,必须同时发送\r 和\n,以便托架将移动到新行的开头。现在,在终端键盘上打字时,自然希望运算符(operator)按一个键,而不是按两个键。 Apple 上的那个][ 是键 'Return' (\r)。

无论如何,事情就是这样解决的。 C 的创建者担心可移植性——大部分 Unix 是用 C 编写的,不像以前,操作系统是用汇编程序编写的。所以他们不想处理每个平台关于文本表示的怪癖,所以他们根据平台将这个邪恶的黑客添加到他们的 I/O 库中,该文件的输入和输出将被即时“修补”,以便程序将看到 righteous 的新行,Unix 方式 - 为 '\n' - 无论它是来自 Windows 的 '\r\n' 还是来自 Mac 的 '\r'。所以开发者不必担心程序运行的是什么操作系统,它仍然可以读写原生格式的文本文件。

但是有一个问题 - 并非所有文件都是文本,还有其他格式,并且它们对用另一个字符替换一个字符非常敏感。因此,尽管如此,我们将调用这些“二进制文件”并通过在模式中包含“b”来指示 fopen() - 这将标记库不执行任何幕后操作转换。这就是它的样子:)

所以回顾一下,如果文件在二进制模式下使用“b”打开,则不会发生任何转换。如果它以文本模式打开,根据平台的不同,可能会发生一些换行符的转换——从 Unix 的角度来看。自然,在 Unix 平台上,读/写“文本”或“二进制”文件没有区别。

关于python - Windows上python中二进制和文本I/O的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257869/

有关python - Windows上python中二进制和文本I/O的区别的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  4. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐