与终端输出相比,保存到文件时使用 pickle 的奇怪输出

Weird output using pickle while saving to a file compared to the terminal output

所以我今天早上学会了如何使用 pickle 将列表转储到文本文件,因为你不能使用 .write 将列表发送到文件。我正在 youtube 上观看视频,使用 Python 和 NLTK p.4 进行自然语言处理。您可以看到完整的输出应该在那里。他没有将数据推送到 txt 文件,但我想进一步了解更多信息。

示例终端输出: [('PRESIDENT', 'NNP'), ('GEORGE', 'NNP'), ('W.', 'NNP'), ('BUSH', 'NNP'), ("'S", 'POS') 注意:这是假设在整个演讲中都在进行,并在终端中进行。

完整文件输出: €]q (X (qh†qX ApplauseqX NNPq†qX .qh†qX )qh†q e.

我的代码:

import nltk
from nltk.corpus import state_union
from nltk.tokenize import PunktSentenceTokenizer
import pickle

output = open('stoutput.txt', 'wb')
train_text = state_union.raw('2005-GWBush.txt')
sample_text = state_union.raw('2006-GWBush.txt')

custom_sent_tokenizer = PunktSentenceTokenizer(train_text)

tokenized = custom_sent_tokenizer.tokenize(sample_text)

def process_content():

    try:
        for i in tokenized:
            words = nltk.word_tokenize(i)
            tagged = nltk.pos_tag(words)
            print(tagged)
            pickle.dump(tagged, open('stoutput.txt', 'wb'))
    except Exception as e:
           pickle.dump(e, open('stoutput.txt', 'wb'))
           print(str(e))


process_content()

非常感谢任何帮助,因为我知道这需要时间。感谢阅读。

pickle用于序列化Python对象,tagged是一个list对象,所以你看的是一个list强制转换为字符编码的字节流表示,这说明为什么字符串 'Applause' 和 'NNP'(列表的元素)被一堆乱码包围。如果你想要用 print(l) 得到的表示,那么忘记 pickle 并将列表强制写入字符串

with open('stoutput.txt', 'wb') as f:
    f.write(str(tagged))

尽管您可能希望在 for 循环之外使用 with 语句。

编辑:如果您的目标是能够在以后的 Python 会话或脚本中使用此数据,但您希望它的可读性比 pickle 给您的更易读,我建议您将列表转换为 CSV -- 有关说明,请参阅 this question