Python PYPDF2: кодек «utf-8» не может декодировать байт 0x80 в позиции 395: недопустимый начальный байт - PullRequest
0 голосов
/ 31 мая 2018

Я использую учебник для создания корпуса файлов 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 / collection.py в repr (self) 224 штук = [] 225 length = 5 -> 226 для elt in self: 227parts.append (repr (elt)) 228 длина + = len (штук [-1]) + 2

/ anaconda3 / lib / python3.6 / site-packages / nltk / corpus / reader / util.py in iterate_from (self, start_tok) 400 401 # Получите все, что мы можем из этого куска.-> 402 для токов в 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 self._current_toknum = toknum 295 self._current_blocknum = block_index -> 296 токенов = self.read_block (self._stream) 297 утверждают isinstance (токены, (кортеж, список, AbstractLazy), (298 'читатель блока% s () должен вернуть список или кортеж.'%

/ anaconda3 / lib / python3.6 / site-packages / nltk / corpus / reader / plaintext.py в _read_word_block (self), stream) 120 слов = [] 121 для i в диапазоне (20): # читать 20 строк за раз. -> 122 words.extend (self._word_tokenizer.tokenize (stream.readline ())) 123 возвращать слова 124

/ anaconda3 / lib / python3.6 / site-packages / nltk / data.py в readline (self, size) 1166, в то время как True: 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 в _read (self, size) 1398 1399 # Декодировать байты в символы Юникода -> 1400 символов, bytes_decoded = self._incr_decode (bytes) 14011402 # Если мы получили байты, но не смогли их декодировать, тогда читайте дальше.

/ anaconda3 / lib / python3.6 / site-packages / nltk / data.py в _incr_decode (self, bytes) 1429, покаTrue: 1430 try: -> 1431 возвращает self.decode (bytes, 'strict') 1432 за исключением UnicodeDecodeError as exc: 1433 # Если исключение происходит в конце строки,

/ anaconda3 / lib / python3.6 / encodings / utf_8.py in decode (input, errors) 14 15 def decode (input, errors = 'strict'): ---> 16 return codecs.utf_8_decode (input, errors, True) 17 18 класс IncrementalEncoder (codecs.IncrementalEncoder):

UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0x80 в позиции 395: недопустимый начальный байт

Я просматривал различные сообщения,но я все еще не могу сказать, если проблема в том, что я использую неправильные методы или что ядолжен кодировать или декодировать что-то.Если бы это был последний, я не знаю где.Любые идеи были бы хорошы.

1 Ответ

0 голосов
/ 31 мая 2018

Было бы лучше увидеть сообщение об ошибке целиком, но я предполагаю, что вы используете 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')

В противном случае покажите нам сообщение об ошибке, чтобы попытаться точно определить, в чем проблема.

...