【问题标题】:Convert string containing "b'…'" to unicode将包含 "b'...'" 的字符串转换为 unicode
【发布时间】:2021-07-16 22:57:13
【问题描述】:

我现在尝试了几个小时来找到解决此问题的方法。 我需要读入一个生成的 CSV 文件,该文件的列标题格式如下:

"b'Device Name' (b'')"

甚至

"b'Bezugsz\\xc3\\xa4hler' (b'Wh')"

我想将这些字符串转换为 Unicode。但是,直到现在我都不走运。到目前为止,我发现的所有带有编码或解码的示例都没有朝着有用的方向发展。我需要摆脱 b'…' 部分以及 \x 转义。

我希望这里有人能提供一些有用的信息。 :)

编辑:根据要求所需的输出:

"Device Name ()"
"Bezugszähler (Wh)"

第一种情况很容易用 replace() 实现。但我为第二种情况寻找解决方案,然后自然会包括第一种情况。

我尝试了使用 ast.literal_eval() 的解决方案,但这在括号中阻塞。 .encode().decode() 的解决方案也没有按预期工作。

【问题讨论】:

  • 你是说标题字面上有字符“b quote Device Name quote”吗?这对创建这些文件的人来说是一个巨大的错误。您可以使用import ast / ast.literal_eval(s) 将它们转换为字节字符串,然后您可以对其进行解码。
  • 而且,顺便说一下,为了解码它们,你必须知道它们是什么字符集。\xc3 不是 UTF-8。
  • @TimRoberts 但b'Bezugsz\xc3\xa4hler'.decode('utf-8') 返回'Bezugszähler'(不止一个\xc3)。
  • @JosefZ 你说得对,我读错了那个字符串。 C3 A4 绝对是 UTF-8,所以你应该有你需要的一切。
  • 这能回答你的问题吗? read bytes string from file in python3

标签: python string unicode decode


【解决方案1】:

这是一种快速而肮脏的方法:

  1. 使用正则表达式查找虚假字节
  2. 使用ast.literal_eval() 将它们转换为实际字节
  3. 将字节解码为字符串
  4. 重新插入到模板中
headers = [
    "b'Device Name' (b'')",
    "b'Bezugsz\\xc3\\xa4hler' (b'Wh')"]

# ---

import ast
import re

def f(string):
    faux_bytes = re.findall(r"b'.*?'", string)
    real_bytes = [ast.literal_eval(f) for f in faux_bytes]
    decoded = [s.decode() for s in real_bytes]
    return '{} ({})'.format(*decoded)

result = [f(h) for h in headers]
print(result)

输出:

['Device Name ()', 'Bezugszähler (Wh)']

【讨论】:

  • 非常感谢。↑↑ 我仍然不完全明白为什么会这样,但它确实:) – 我只需要添加两行,考虑到一个很好的标题。 :D – 这让我很忙,是的,我从中学到了很多。再次。 – 我需要回到我的旧生成器脚本来修复该输出。我还不知道我会从中学到什么。 :D
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多