【问题标题】:Newline characters in non ASCII encoded files非 ASCII 编码文件中的换行符
【发布时间】:2009-02-04 22:28:09
【问题描述】:

我正在使用 Python 2.6 读取带有 windows 行结尾 ('\r\n') 的 latin2 编码文件。

import codecs

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='rt')
line = file.readline()
print(repr(line))

输出:u'login: yabcok\n'

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='r')
line = file.readline()
print(repr(line))

或

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='rb')
line = file.readline()
print(repr(line))

输出:u'password: l1x1%Dm\r\n'

我的问题:

  1. 为什么文本模式不是默认模式?文档另有说明。 codecs 模块是否常用于二进制文件?
  2. 为什么没有从 readline() 输出中去除换行符?这既烦人又多余。
  3. 有没有办法为非 ASCII 编码的文件指定换行符。

【问题讨论】:

    标签: python encoding file


    【解决方案1】:

    你确定你的例子是正确的吗?编解码器模块的documentation 表示:

    注意:文件总是以二进制模式打开,即使没有指定二进制模式。这样做是为了避免由于使用 8 位值进行编码而导致的数据丢失。这意味着在读写时不会自动转换 '\n'。

    在我的系统上,使用 Latin-2 编码文件 + DOS 行结尾,“rt”、“r”和“rb”之间没有区别(免责声明:我在 Linux 上使用 2.5)。

    open 的文档也没有提到“t”标志,所以这种行为看起来有点奇怪。

    换行符不会从行中删除,因为并非所有由readline 返回的行都可能以换行符结尾。如果文件不以换行符结尾,则最后一行不带换行符。 (我显然想不出更好的解释)。

    换行符不会因编码而异(至少在使用 ASCII 表示 0-127 的编码中不会有所不同),仅基于平台。您可以在打开文件时在模式中指定“U”,Python 将检测任何形式的换行符,无论是 Windows、Mac 还是 Unix。

    【讨论】:

    • 我知道换行符没有什么不同,但其余的文本是,所以我必须使用编解码器 API。 U 已被弃用(docs.python.org/library/io.html#io.open),但你说得对。我用的是windows xp,结果如上。
    • 嗯,我真的应该切换到 2.6,但我正处于一个更大项目的后期阶段,即使我现在也不敢切换。很抱歉无法提供帮助。
    【解决方案2】:

    mode='rt'

    'rt' 本身并不是一个实模式 - 它与 'r' 的作用相同。

    为什么文本模式不是默认模式?

    查看 Torsten 的回答。

    此外,如果您使用的不是 Windows,文本模式文件的行为无论如何都与二进制文件相同。

    您可能会想到“U”通用换行模式,它试图允许其他平台的文本模式文件工作。虽然可以将“U”标志传递给 codecs.open,但鉴于上面概述的文档,我认为它是 bug。当然,UTF-16 和一些东亚编解码器的结果会出错,所以不要依赖它。

    为什么没有从 readline() 输出中去除换行符?

    必须能够判断文件的最后一行是否以尾随换行符结尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-07
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2020-01-22
      • 2012-06-17
      • 1970-01-01
      相关资源
      最近更新 更多