【问题标题】:Turning 'bytes' into 'str': Why is a '\' added to '\n' and such?将 'bytes' 变成 'str':为什么要在 '\n' 中添加 '\' 等?
【发布时间】: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


【解决方案1】:

是的,由于 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()

【讨论】:

  • “(从德语的使用来看,它是'latin1')”这并不是一个合理的推论。 utf8 等可以很好地处理德语字符,它只是一种不同的编码。
  • @juanpa.arrivillaga 这是合理的。有问题的字符集显然不是 ** UTF-8 也不是任何其他类型的 Unicode 编码,它是传统的 8 位编码之一。对于德语,最有可能的 8 位编码是 'latin1' (ISO/IEC 8859-1) 或可能是 'cp1252' a.k.a. 'windows-1252',但肯定不是,例如,'latin2'
  • 当然,我的意思是简单的“German => latin1”并不是一个好的推断。
  • 谢谢,这行得通。就我而言,根据fileISO-8859 text, with CRLF line terminators,这不是很清楚,但cp1252 对我有用。此外,cmets 中的 Yamila Omars 链接对问题的理解非常有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2020-11-17
  • 2012-03-19
  • 2019-12-23
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多