将 '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()
)
我从这样的 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
.
是的,由于 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()
)