我使用Twitter API for python以UTF-8下载了关于阿姆斯特丹的推文。 现在我正在尝试为LDA创建一个字典,使用这段代码(只是代码的一部分,但这是导致错误的部分):
dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file))
总是给我一个错误,取决于我选择哪个txt文件作为输入:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 2: invalid continuation byte
或
UnicodeDecodeError: 'utf8' codec can't decode byte xxxx in position 175-176: unexpected end of data
我希望其原因是UTF-8中未知的字符(推文中可能使用的一些表情符号)以及Googling尝试将代码替换为:
dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, errors='ignore'))
错误消息:
dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, errors='ignore'))
TypeError: 'errors' is an invalid keyword argument for this function
或
dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, 'ignore'))
错误消息:
dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, 'ignore'))
ValueError: mode string must begin with one of 'r', 'w', 'a' or 'U', not 'ignore'
有没有人有解决方案?感谢
答案 0 :(得分:0)
您的错误处理位置错误。要求忽略解码错误时,您无法打开文件;这种情况发生在下一步。
你应该做什么,是以二进制模式(rb
修饰符)打开文件并读取行。它们将成为bytes
个对象。然后你可以解码它们并忽略错误:
with open('/tmp/myfile', 'rb') as f:
for linebytes in f.readlines():
linestring = linebytes.decode(encoding='utf-8', errors='ignore')
答案 1 :(得分:0)
您的输入文件显然不是UTF-8。应该有文档说明这些Twitter文件的实际编码是什么;打开文件时相应地设置编码。
with open(input_file,encoding="whatever Twitter uses") as twitterfile:
dictionary = corpora.Dictionary(line.lower().split() for line in twitterfile)
这样Python就会将输入解码为没有错误的字符串,这显然优于忽略错误和破坏数据。
答案 2 :(得分:0)
如果您知道您正在阅读的数据是utf-8,则可以导入编解码器模块并使用codecs.open()
代替open()
Reading and Writing Unicode Data
尝试一下:
import codecs
dictionary = corpora.Dictionary(line.lower().split() for line in codecs.open(input_file, mode='r', encoding='utf-8', errors='ignore'))