我遇到的麻烦比我想承认的要多。我已经检查了很多帖子,但没有运气。我正在尝试转换像这样的字节对象:
b = b'%PDF-1.5\r%\xe2\xe3\xcf\xd3\r\n'
成一个字符串变量。
我已经尝试了以下内容,
import codecs
codecs.decode(b, 'hex')
# Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)
b.decode('hex')
# LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs
b.unhexlify(_)
#AttributeError: 'bytes' object has no attribute 'unhexlify'
str(b)
# just gives me the same bytes object with str type
b.decode('utf-8')
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte
谁能告诉我这里我做错了什么?
答案 0 :(得分:1)
你有什么PDF文件;虽然部分基于ASCII文本,但PDF文件不是纯文本。你可以找到一种方法来解码标题中的魔术字节(iso8859-1应该这样做),但是一旦你点击一个deflate压缩的流,你就会有完整的熵256字节序列,这不是任何编解码器都有意义地解码。
IOW:没有办法将PDF文件的整个字节内容有意义地解码为Unicode字符串,因为它不是任何类型的Unicode代码点的直接表示。这就像尝试将JPEG文件解码为Unicode字符串一样:没有意义和它是不可能的。
如果你想从PDF文件中提取文本,你必须实际解析和解码它的结构,这根本不是微不足道的。
答案 1 :(得分:0)
实际上b
已经是一个字符串。您可以通过类型检查并验证它是否打印出所有特殊字符来了解它:
>>> b = b'%PDF-1.5\r%\xe2\xe3\xcf\xd3\r\n'
>>> type(b)
<type 'str'>
>>> print(b)
%ÔѤË1.5
>>>
如果你有真正的字节对象,你可以使用.decode(encoding)
从字节转换为字符串。不好的是你需要知道你的编码才能做到这一点。
我使用此网站上的几个编码进行了反复试验:https://docs.python.org/2.4/lib/standard-encodings.html。它没有产生iso8859_15的错误,但我不能保证它是一个好的。这是一个片段:
line.decode('iso8859_15')