【发布时间】:2020-02-13 10:02:48
【问题描述】:
我从这样的 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),它们不会出现,但是如果我想用line = line.replace('\xe4', 'ae') 将\xe4 变成ae(另一种写作方式),这将无济于事。但是,使用 '\\xe4' 可以。但我原以为第一个只是将 \\xe4 变成 \ae 而不是什么都不做,而第二个选项在工作时依赖于我定义的 new 定义来替换ä,我宁愿避免这两种情况。
所以我试图了解多余的反斜杠从何而来,以及如何从一开始就避免它,而不是在我的后处理中修复它。我感觉有些事情发生了变化在 python2 和 3 之间,因为原始的 csv 阅读器是我用 2to3 翻译的 python2 脚本。
【问题讨论】:
-
不要这样做:
line = str(line)。您想将bytes对象解码 为str对象,然后将其传递给str对象构造函数,只为您提供字节对象的字符串表示,这不是你想要的。您可能应该以文本模式打开文件,所以f1 = open(current_csv, 'r')所以'r'而不是'rb' -
是的,Python 2 和 3 之间有一些变化。您可以阅读与字符串相关的内容 [这里][1] [1]:medium.com/better-programming/…
-
@L3viathan 是的,我的错
-
我认为我主动选择了
rb,因为r无法处理像ä 这样的变音符号,我稍后会处理(现在失败了)。 -
@JC_CL 嗯,是的,
'r'可以处理得很好,你只需要提供正确的编码。所以f1 = open(current_csv, 'r', encoding='latin1')
标签: python string replace python-2to3