我正在读别人,并谈到有关unicode的部分,这对我来说总是很头疼。如果你能提供一些提示,这将真的有很大的帮助。
情况如此: 我有一个名为stopword.txt的禁用文件,其格式如下:
1 781037
2 650706 damen
3 196100 löwe
4 146044 lego
5 138280 monster
6 136410 high
7 100657 kost%c3%bcm #this % seems to be strange already
8 94084 schuhe
9 93680 kinder
10 87308 mit
和尝试阅读的代码,看起来像:
with open('%s/%s'%('path_to_stopwords.txt'), 'r') as f:
stoplines = [line.decode('utf-8').strip() for line in f.readlines()]
这个解码('utf-8')对我来说似乎很神秘。正如我的理解,没有额外的 规范“open”方法将文件读入字符串,将自动编码为 ascii(所以在这种情况下,如果打开的文件包含代码点在128之外的字符,就像löwe一样,它会被读入带有编码ascii的程序,因为那么ö会被截断编码吗?)在读入程序后尝试将其解码为utf-8?
为了验证我的想法,我尝试使用代码检查每行中的内容。
for line in stoplines:
print line
给了我:
%09
%21%21%21
%26
%26amp%3b
%28buch%29
%28gr.
%2b
%2bbarbie
我很困惑这些%来自哪里。我是否在文件的上下文中正确阅读了?
非常感谢你
答案 0 :(得分:2)
在Python 2中,当你打开一个文件并从中读取时,你得到一个str
实例,而不是unicode
字符串(在Python 3中,你得到一个str
},这是Python 3中的unicode。
str.decode('utf-8')
可让您将str
解码为unicode
字符串(假设编码为UTF8!)。
您的停用词似乎是URL-encoded:
print urllib.unquote('%c3%bc')
ü
如果文件应该是UTF8(本身支持ü
等字符),那么使用urlencoding确实是多余的,但我的直觉是这个文件实际上是ASCII,而不是UTF8。
所有ASCII字符都映射到UTF8中的相同字符,因此尽管有错误,但这仍然有效。
答案 1 :(得分:1)
几点: