将包含 "b'...'" 的字符串转换为 unicode

问题描述

我现在尝试了几个小时来寻找解决此问题的方法。 我需要读入一个生成的 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() 的解决方案也没有按预期工作。

解决方法

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

  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)']