如何在Python中将rb模式获得的二进制类型字符串转换为普通字符串?

如何在Python中将rb模式获得的二进制类型字符串转换为普通字符串?,python,regex,string,pandas,decode,Python,Regex,String,Pandas,Decode,我有一个二进制类型字符串的列表,如下所示,它是通过在rb模式下读取文本文件获得的,因为r不适用于读取文件,因为可能是来自各种编码的混合字符:- 新列表=[b'Vanessa Skarski对她父亲死亡的描述,…],b'Hornslet风力涡轮机倒塌\r\n来自维基百科'…]等 列表中共有271项。但是我希望列表项是普通字符串,而不是二进制字符串。我已经考虑过使用 新列表=[item.decodeconding='utf-8'用于新列表中的项] 但它给出了UnicodeDecodeError:“u

我有一个二进制类型字符串的列表,如下所示,它是通过在rb模式下读取文本文件获得的,因为r不适用于读取文件,因为可能是来自各种编码的混合字符:-

新列表=[b'Vanessa Skarski对她父亲死亡的描述,…],b'Hornslet风力涡轮机倒塌\r\n来自维基百科'…]等

列表中共有271项。但是我希望列表项是普通字符串,而不是二进制字符串。我已经考虑过使用 新列表=[item.decodeconding='utf-8'用于新列表中的项]

但它给出了UnicodeDecodeError:“utf-8”编解码器无法对643位置的字节0x93进行解码:无效的起始字节。我只是想去掉b'并得到普通字符串。有什么想法吗

编辑 中提到的解决方案并没有像我在最初的帖子中提到的那样解决这个问题。下面列出了我的Python版本,如果这与错误有任何关系的话

3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
只需使用“utf8”而不是“utf-8”。在Windows 10上使用Python 3.7为我工作

new_list = [b'Vanessa Skarski\'s Account of Her Father\'s Death....', b'Hornslet wind-turbine collapse\r\nFrom Wikipedia']

for item in new_list:
    decoded_item = item.decode('utf8')
    print(item)
    print(type(item))
    print(decoded_item)
    print(type(decoded_item))
    print()
输出:

b"Vanessa Skarski's Account of Her Father's Death...."
<class 'bytes'>
Vanessa Skarski's Account of Her Father's Death....
<class 'str'>

b'Hornslet wind-turbine collapse\r\nFrom Wikipedia'
<class 'bytes'>
Hornslet wind-turbine collapse
From Wikipedia
<class 'str'>

您拥有的bytes对象没有用UTF-8编码。 编码取决于文件的实际信息,除了最初创建文件并知道使用了什么编码的人之外,没有人能告诉您如何正确编码文件

然而,根据上下文,流行的选择可能是:

latin1将始终解码,但可能对您没有意义 cp1252是Windows系统的流行选择 因此,例如:

new_list = [item.decode(encoding='latin1') for item in new_list]

可能是@norok2的重复,正如我已经提到的,我已经尝试了各种使用utf-8解码语法的解决方案,但没有任何效果。所以我猜这不是复制品。我编辑了这个问题来提到这一点。感谢如果你更仔细地检查接受的答案,它会说:这里使用utf-8是因为它是一种非常常见的编码,但是你需要使用你的数据实际使用的编码。方法正确,编码错误。您可能会认为是这样。@norok2我是以二进制模式rb读取文本文件的。那么你能告诉我它的编码是什么吗?感谢二进制的全部思想是它没有编码——它是原始字节。您需要知道编码才能将其转换为字符串。我们本来可以帮你弄清楚的,但是你等着看重要的部分。位置643及其周围是什么?我得到了相同的错误UnicodeDecodeError:“utf-8”编解码器无法解码位置643中的字节0x93:无效的起始字节,即使使用utf8而不是utf,“utf-8”和“utf8”在Python中指的是完全相同的编码-请参阅列表哦,好的。谢谢,蛇怪。我想我遇到过这样的情况,“utf-8”是错误的,“utf8”是正确的。但我可能会把事情搞糊涂,因为这是很久以前的事了。正如我所说,latin1将始终有效,即不会出现错误,但它可能不会给你一个有意义的结果,例如“24°C”。编码“utf8”。解码“latin1”将给你“24°C”。因此,一定要检查您的结果。当我偶然发现我对编码不确定的情况时,我使用了这种方法,当时我只是循环遍历所有编码的列表,并在try-catch块中应用它们。然后我看了看哪一个效果最好。不确定这是否被认为是一种好的方法,但对我来说是有效的。@ConstantineKetskalo鉴于有些方法总是有效的,你需要找到比捕捉错误更好的验证方法。@norok2可能是的。但有一次,当我只需要处理一到两个文件时,我只是通过手动选择工作内容来使用它。还有一次,当我需要大量使用它们时,我只编写了一些代码,但选择了第一种编码,这会导致文本包含我需要的特定字符串。也许有人会对此有更好的想法。我很高兴听到这个消息。