我是Python的新用户,我主要使用导入的文本文件,特别是csv,这让我很难处理。我试着阅读像这样的文档:https://docs.python.org/2/howto/unicode.html但我不明白所说的内容的线索。我只是想要一些直截了当的解释。
例如,我想将从互联网导出的大量verbatims标记为csv文件。我想使用NLTK的tokenizer来实现。
这是我的代码:
{{1}}
当我对数据进行print()时,我会得到干净的文字。
但是当我使用tokenizer方法时,它会返回以下错误:
'ascii'编解码器无法解码位置31中的字节0xe9:顺序不在 范围(128)
它看起来像编码问题。每次使用文本操作时都会遇到同样的问题。你能帮我解决这个问题吗?
答案 0 :(得分:2)
这应该这样做:
with open('verbatim.csv') as csvfile: # No need to set mode to 'r', r is default
reader = unicode_csv_reader(csvfile, dialect=csv.excel)
for data in reader:
tokens = nltk.word_tokenize(unicode(data, 'utf-8'))
否则你也可以尝试:
import codecs
with codecs.open('verbatim.csv', encoding='utf-8') as csvfile:
reader = unicode_csv_reader(csvfile, dialect=csv.excel)
for data in reader:
tokens = nltk.word_tokenize(data)
答案 1 :(得分:0)
首先你必须明白str和unicode是两种不同的类型。
关于这个主题有很多文档和很好的讨论。我认为这是最好的之一:https://www.youtube.com/watch?v=sgHbC6udIqc
如果您打算使用文本,您应该真正理解这些差异。
过度简化,str
是一个字节序列。 unicode
是一系列“字符”(代码点),用于获取带有和编码的unicode对象encode
的字节序列。
是的,很复杂。我的建议,看视频。
我不确定你的unicode_csv_reader
做了什么,但我猜测问题就在那里,因为nltk
适用于unicode。所以我猜你在unicode_csv_reader中尝试使用错误的编解码器对某些内容进行编码/解码。
In [1]: import nltk
In [2]: nltk.word_tokenize(u'mi papá tiene 100 años')
Out[2]: [u'mi', u'pap\xe1', u'tiene', u'100', u'a\xf1os']
我会使用pypi中的包unicodecsv
。它返回每行可以传递给nltk的unicode对象列表。
import unicodecsv
with open('verbatim.csv', 'r') as csvfile:
reader = unicodecsv.reader(csvfile, dialect=csv.excel, encoding='iso-8859-1')
for data in reader:
tokens = nltk.word_tokenize(data)
您可以为阅读器提供和编码,而且无需使用编解码器打开文件。