非ASCII编码文件中的换行符

时间:2009-02-04 22:28:09

标签: python encoding file

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

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编码的文件指定换行符。

2 个答案:

答案 0 :(得分:4)

您确定您的示例是正确的吗?编解码器模块的documentation说:

  

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

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

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

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

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

答案 1 :(得分:1)

  

模式= 'RT'

'rt'不是真正的模式 - 与'r'相同。

  

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

见托尔斯滕的回答。

此外,如果您使用的是Windows以外的任何内容,则文本模式文件的行为与二进制文件完全相同。

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

  

为什么换行符不会从readline()输出中删除?

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