将 'bytes' 变成 'str':为什么要在 '\n' 之类的后面加上 '\'?

Turning 'bytes' into 'str': Why is a '\' added to '\n' and such?

我从这样的 CSV 文件中读取了多行:

f1 = open(current_csv, 'rb')
table = f1.readlines()
f1.close()

所以基本上 table 中的任何一行都是这样的:

line = b' G\xe4rmanword:           123,45\r\n'

type 告诉我的是 bytes,但我需要解决 .replace 所以我把它变成一个字符串:line = str(line),但现在line变成了

"b' G\xe4rmanword:           123,45\r\n'"

在每个 \ 之前加上 \。但是,对于 print(line),它们不会出现,但是如果我想将 \xe4 变成 ae(另一种写 ä 的方式)和 line = line.replace('\xe4', 'ae'),这什么都不做.但是,使用 '\xe4' 是可行的。但我本以为第一个只是将 \xe4 变成 \ae 而不是什么都不做,而第二个选项在工作时依赖于我定义的 new 替换 ä 的定义,我宁愿避免这两者。

所以我试图了解额外的反斜杠从何而来以及如何避免它开始,而不必在我的后处理中修复它。我有感觉 python2 和 3 之间发生了某些变化,因为原始 csv reader 是我用 2to3.

翻译的 python2 脚本

是的,由于 Python3 对所有字符串使用 Unicode,因此与 Python2 相比,包括 str 在内的许多与字符串相关的函数的语义都发生了变化。在这种特殊情况下,您需要使用 str 的第二个参数来提供输入 bytes 值中使用的编码(从德语的使用来看,它是 'latin1'):

unicode_string = str(line, 'latin1')

或者您也可以使用

做同样的事情
unicode_string = line.decode('latin1')

您可能希望删除 \r\n,因此添加 .rstrip()。 此外,更优雅的读取文件的解决方案是:

with open(current_csv, 'rb') as f1:
    table = f1.readlines()

(所以不需要 close()