2014-07-10 153 views
0

我正在閱讀其他人,並且涉及unicode的部分,這對我來說總是令人頭痛的。如果你能提供一些提示,那真的會有很大的幫助。unicode中的%2是什麼

的情況是這樣: 我有一個名爲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')似乎對我來說很神祕。正如我的理解,沒有額外的 規範「打開」方法讀入文件作爲字符串,將被自動編碼爲 ascii(所以在這種情況下,如果打開的文件包含代碼點在128之外的字符,我們將它讀入編碼爲ascii的程序中,因爲那麼ö將被截斷編碼?)在讀入程序後嘗試將它解碼爲utf-8的含義是什麼?

爲了驗證我的想法,我試圖用代碼來檢查每行中的內容。

for line in stoplines: 
     print line 

這給了我:

%09 
    %21%21%21 
    %26 
    %26amp%3b 
    %28buch%29 
    %28gr. 
    %2b 
    %2bbarbie 

我很困惑,其中這些%從何而來。我是否正確閱讀了文件的上下文?

Thnak你非常

+2

你爲什麼要用'%s /%s'%('path_to_stopwords.txt')'? –

回答

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(其中原生支持的字符,如ü)使用URL編碼,但我的直覺會是這個文件實際上是ASCII,而不是UTF8。

所有的ASCII字符都映射到UTF8中的同一個字符,所以這個工作原理儘管是錯誤的。

1

的幾點:

  1. 如果該文件是UTF-8,你應該打開這一切爲UTF-8,而不是一行行。讀取全部內容然後解碼(即f.read()。decode(「utf-8」))或使用帶有UTF-8的codecs.open打開它。
  2. 你不需要f.readlines(),你可以簡單地做「for line in f」。它更高效,更短。
  3. '%s /%s'%('path_to_stopwords.txt')甚至不起作用。確保你做得正確。您可能想要使用os.path.join來加入路徑。
  4. %編碼是url編碼。正如上面托馬斯寫的,你可以使用urllib.unquote。
+0

非常感謝您的意見:) –