【问题标题】:Python PYPDF2 : 'utf-8' codec can't decode byte 0x80 in position 395: invalid start bytePython PYPDF2:'utf-8'编解码器无法解码位置 395 的字节 0x80:无效的起始字节
【发布时间】:2018-05-31 15:01:48
【问题描述】:

我正在使用教程来创建 pdf 文件的语料库。我有以下代码:

import nltk
import PyPDF2
from nltk.corpus.reader.plaintext import PlaintextCorpusReader
from PyPDF2 import PdfFileReader

def getTextPDF(pdfFileName):
pdf_file = open(pdfFileName, 'rb')
readpdf = PdfFileReader(pdf_file)
text = []
for i in range(0,readpdf.getNumPages()):
    text.append(readpdf.getPage(i).extractText())
return '\n'.join(text)

corpusDir = 'reports/'

jun15 = getTextPDF('reports/June2015.pdf')
dec15 = getTextPDF('reports/December2015.pdf')
jun16 = getTextPDF('reports/June2016.pdf')
dec16 = getTextPDF('reports/December2016.pdf')
jun17 = getTextPDF('reports/June2017.pdf')
dec17 = getTextPDF('reports/December2017.pdf')

files = [jun15,dec15,jun16,dec16,jun17,dec17]
for idx, f in enumerate(files):
    with open (corpusDir+str(idx)+'.txt','w') as output:
        output.write(f)

corpus = PlaintextCorpusReader(corpusDir, '.*')

print (corpus.words())

UnicodeDecodeError Traceback(最近调用 最后)在() ----> 1 个打印 (corpus.words())

/anaconda3/lib/python3.6/site-packages/nltk/collections.py 在 代表(自我) 224 件 = [] 225 长度 = 5 --> 226 for elt in self: 227 件.append(repr(elt)) 228 长度 += len(pieces[-1]) + 2

/anaconda3/lib/python3.6/site-packages/nltk/corpus/reader/util.py 在 iterate_from(self, start_tok) 400 401 # 从这件作品中获取我们所能得到的一切。 --> 402 fork in piece.iterate_from(max(0, start_tok-offset)): 403 收益托克 404

/anaconda3/lib/python3.6/site-packages/nltk/corpus/reader/util.py 在 iterate_from(self, start_tok) 第294章 第295章 --> 296 个令牌 = self.read_block(self._stream) 第297章 ' 298 '块读取器 %s() 应该返回列表或元组。' %

/anaconda3/lib/python3.6/site-packages/nltk/corpus/reader/plaintext.py 在 _read_word_block(自我,流) 120 字 = [] 121 for i in range(20): # 一次读取 20 行。 --> 122 words.extend(self._word_tokenizer.tokenize(stream.readline())) 123回话 124

/anaconda3/lib/python3.6/site-packages/nltk/data.py in readline(self, 大小)1166 而真:1167 startpos = self.stream.tell() - len(self.bytebuffer) -> 1168 new_chars = self._read(readsize) 1169 1170 # 如果我们在 '\r' 处,则多读一个字符,因为

/anaconda3/lib/python3.6/site-packages/nltk/data.py in _read(self, size) 1398 1399 # 将字节解码为 un​​icode 人物 -> 1400 chars, bytes_decoded = self._incr_decode(bytes) 1401 1402 # 如果我们得到了字节但无法解码,那么 进一步阅读。

/anaconda3/lib/python3.6/site-packages/nltk/data.py 在 _incr_decode(self, bytes) 1429 while True: 1430 尝试: -> 1431 return self.decode(bytes, 'strict') 1432 except UnicodeDecodeError as exc: 1433 # If the 字符串末尾出现异常,

/anaconda3/lib/python3.6/encodings/utf_8.py 解码(输入,错误) 14 15 def解码(输入,错误='严格'): ---> 16 返回 codecs.utf_8_decode(input, errors, True) 17 18类IncrementalEncoder(codecs.IncrementalEncoder):

UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 0x80 字节 395: 无效的起始字节

我一直在查看不同的帖子,但我仍然无法判断问题是我使用了错误的方法还是我必须对某些内容进行编码或解码。如果是后者,我不知道在哪里。任何想法,将不胜感激。

【问题讨论】:

    标签: nlp nltk pypdf2


    【解决方案1】:

    最好查看整个错误消息,但我猜您使用的是 python 2,并且您的报告中有一些 utf-8。首先,尝试在开头和打开文件时指定编码:

    #!/usr/bin/python
    #-*- coding:utf-8 -*- 
    import nltk
    import PyPDF2
    from nltk.corpus.reader.plaintext import PlaintextCorpusReader
    from PyPDF2 import PdfFileReader
    import codecs
    def getTextPDF(pdfFileName):
        pdf_file = codecs.open(pdfFileName, 'rb', encoding='utf8')
        readpdf = PdfFileReader(pdf_file)
        text = []
        for i in range(0,readpdf.getNumPages()):
            text.append(readpdf.getPage(i).extractText())
        return '\n'.join(text)
    
    corpusDir = 'reports/'
    
    jun15 = getTextPDF('reports/June2015.pdf')
    dec15 = getTextPDF('reports/December2015.pdf')
    jun16 = getTextPDF('reports/June2016.pdf')
    dec16 = getTextPDF('reports/December2016.pdf')
    jun17 = getTextPDF('reports/June2017.pdf')
    dec17 = getTextPDF('reports/December2017.pdf')
    
    files = [jun15,dec15,jun16,dec16,jun17,dec17]
    for idx, f in enumerate(files):
        with codecs.open(corpusDir+str(idx)+'.txt','w', encoding='utf8') as output:
            output.write(f)
    
    corpus = PlaintextCorpusReader(corpusDir, '.*')
    
    print (corpus.words())
    

    如果这不起作用,您可以尝试使用您的字符串,但这并不理想:

    def toUtf8(stringOrUnicode):
        '''
        Returns the argument in utf-8 encoding
        '''
        typeArg = type(stringOrUnicode)
        if typeArg is unicode:
            return stringOrUnicode.encode('utf8').decode('utf8')
        elif typeArg is str:
            return stringOrUnicode.decode('utf8')
    

    否则,向我们显示消息错误以尝试准确检测问题所在。

    【讨论】:

    • 谢谢。我尝试了您给我的第一个建议,但现在我在尝试使用 getTextPDF 方法时收到“TypeError:必须是 str,而不是字节”。
    猜你喜欢
    • 2020-09-22
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多