跳到主内容

琅環笔记

有博学强记者,尝为鹅厂从事。游于洞宫,遇一人于途,问逍遥曰:“君读书几何?”遥曰:“吾之未读者,则二十年内书盖有之也,若二十年外,则吾固已尽读之矣。”其人论议超然,遥颇内服,相与欢甚。因共至一处,大石中忽然有门,引遥入数歩,则别是天地,宫室嵯峨。引入一室中,陈书满架,其人曰:“此PL史也。”又至一室,则曰:“OS志也。”毎室各有奇书,惟一室屋宇颇高,封识甚严,有二犬守之。遥问故,答曰:“此皆操作系统、编程语言、算法分析、生发正骨诸秘籍。”指二犬曰:“此龙也。”历观诸室书,皆Windows以前事,多所未闻者,如「BeOS」、「Solaris」、「FreeBSD」、「LISP」亦皆在焉。遥心乐之,欲赁住数十日,其人笑曰:“君痴矣。此岂可赁地耶?”即命小童送出,遥问地名,对曰:“琅嬛福地也。”

The different linesep between codecs open and open in python 3

文件分隔符之回车换行的故事

最初的打字机上,将打字位置 Carriage 从行末移动到行首叫做 Carriage Return,既CR,既回车,将纸张上滚一行,叫做换行 Linefeed。

来到计算机时代,分别为这两种操作都定义了 ASCII 码

  1. ASCII \n: CR,Carriage Return,UNIX 上是行分隔符,newline,取第一个字;macOS 也采用了此换行符;

  2. ASCII \r: LF,Linefeed,Classic Mac OS 中,文件换行符是这个;

  3. ASCII \r\n: CRLF,Carriage Return & Linefeed,Windows 最晚出现,为在 Windows 上能显示 Unix 和 Apple Mac OS 文件内容,弄出一个兼容的。

Python 世界的换行

为兼容各平台差异,Python 的 os 模块中弄出多个属性来处理,比如

  • linesep 行分隔符

  • sep 文件路径名分割符

  • pathsep 文件路径分隔符

  • curdir 当前工作目录

  • pardir 父目录

os 模块是处理好了这件事,但其它模块却不一定。

Python 2 的写文件

  1. open(),可能最早从 c 语言 fopen 学习的,未考虑编码参数

  2. codecs.open(),支持编码参数

  3. io.open(),支持编码参数的 open(),推荐使用

Python 3 的写文件

  1. open(),修正了 Python 2 时代的设计遗漏,支持 encoding 和 newline 参数

  2. codecs.open(),在读写文件时不推荐使用了,且此模块方法在 Windows 下有坑,文件换行符会弄成 LF

不同平台的差异随处可见

一定程度上反映了,人各有各的思想,分久必合,当人们无法忍受差异时,就会发展为统一。

评论

Comments powered by Disqus