代码之家  ›  专栏  ›  技术社区  ›  Jacek Ławrynowicz

非ASCII编码文件中的换行符

  •  1
  • Jacek Ławrynowicz  · 技术社区  · 17 年前

    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()输出中剥离换行符?这是恼人的和多余的。
    2 回复  |  直到 17 年前
        1
  •  3
  •   Torsten Marek    17 年前

    你确定你的例子是正确的吗?这个 documentation 编解码器模块的

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

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

    文件 open

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

        2
  •  0
  •   bobince    17 年前

    mode='rt'

    'rt'不是一个真正的模式,它的作用与'r'相同。

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

    看看托尔斯滕的回答。

    相反,您可能会想到“U”通用换行模式,它试图允许其他平台的文本模式文件正常工作。同时可以向编解码器.打开,考虑到上面提到的医生我认为 bug . 当然,UTF-16和一些东亚编解码器的结果会出错,所以不要依赖它。