我正在使用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'
我的问题:
codecs
模块是否常用于二进制文件?答案 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()输出中删除?
必须能够判断文件的最后一行是否以尾随换行结束。