在Python3中用unicode进行酸洗

时间:2018-02-02 23:17:30

标签: python pickle python-unicode

我正在尝试挑选{word:{docId:int}}形式的字典。我的代码如下:

def vocabProcess(documents):
    word_splitter = re.compile(r"\w+", re.VERBOSE)
    stemmer=PorterStemmer()#
    stop_words = set(stopwords.words('english'))

    wordDict = {}
    for docId in documents:
        processedDoc = [stemmer.stem(w.lower()) for w in 
        word_splitter.findall(reuters.raw(docId)) if not w in stop_words]

        for w in processedDoc:
            if w not in wordDict:
                wordDict[w] = {docId : processedDoc.count(w)}
            else:
                wordDict[w][docId] = processedDoc.count(w)
    with open("vocabListings.txt", "wb") as f:
        _pickle.dump(wordDict, f)

if __name__ == "__main__":
    documents = reuters.fileids()
    with open("vocabListings.txt", "r") as f:
        vocabulary = _pickle.load(f)    

当我运行此代码时,我收到错误

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2399: 
character maps to <undefined>

当没有路透社文档/ docids中有unicode时,为什么会破坏?我如何解决这个问题,以便我仍然可以使用_pickle模块?

1 个答案:

答案 0 :(得分:2)

您需要使用二进制模式来编写读取泡菜。你的问题是:

with open("vocabListings.txt", "r") as f:
    vocabulary = _pickle.load(f)    

在Python 3上,以文本模式阅读会使str(文本类型)不是bytespickle使用的二进制类型)。并且它会尝试解码数据,就好像它是您的语言环境编码中的文本一样;原始二进制流在许多编码中不太可能有效,因此在pickle甚至看到数据之前,您将遇到错误。

在Windows上的Python 2上,读取文本模式有时会起作用,除非二进制数据在数据中有\r\n序列,在这种情况下数据将被破坏(它将替换为{{1数据\n中看到的数据)。

无论哪种方式,使用模式pickle来阅读(就像你使用"rb"一样),你就可以了。