为什么 rstrip 不能 return Python 中的原始文本?

Why rstrip cannot return raw text in Python?

我正在尝试使用以下 Python 代码逐行打印西班牙语文本:

path = 'segismundo.txt'   #set the path file
f = open(path, encoding="utf-8")
lines = [x.rstrip() for x in open(path)]
print(lines)

原始文本是:

Sueña el rico en su riqueza,
que más cuidados le ofrece;

sueña el pobre que padece
su miseria y su pobreza;

然而,结果是:

['Sue帽a el rico en su riqueza,', 'que m谩s cuidados le ofrece;', '', 'sue帽a el pobreque 
padece', 'su miseria y su pobreza;', '']

我的系统语言是中文('帽子''骂'都是汉字)不知道是不是因为rstrip方法只能执行英文?

编码和解码是一个棘手的问题,尤其是因为当前的软件必须尽量保持与 pre-Unicode 软件和文件的兼容性。

所以您列出的文本不是 raw,因为它没有存储在文件中。大多数文件系统中的文件都包含字节,您必须通过其他一些方式了解这些文件使用的编码。为此,Python 默认情况下会根据区域设置猜测用于打开文件的编码。您可以使用 openencoding 参数覆盖它,就像您在以 f = ... 开头的行中所做的那样,但关键是 而不是 在下一行, 您可以在其中使用默认编码再次打开同一文件。

print 有一个类似的问题:它可以写入文件,或者输出可以打印在终端上,或者通过管道传输到另一个进程,但关键是所有这些进程都对原始序列进行操作字节,因此需要对字符串进行编码。

所以你的代码中有两个潜在的不匹配:

  1. 该文件使用 UTF-8 编码,但使用您的系统默认值进行解码,这可能不是 UTF-8。
  2. 输出使用您的系统默认编码进行编码,但您的终端假定它是其他编码。

根据您问题中的线索,我猜您只需将阅读文本的行更改为:

lines = [x.rstrip() for x in f]

您也永远不会关闭文件,这通常不是问题,但对于较大的应用程序要记住一些事情:您不想在不需要时让文件保持打开状态。