2016-04-30 16 views
-1

假設我有具有例如多於一個的列表的列表:的Python - 解碼UTF-8表中列出(解碼整個列表對象)

l = [['a'],['a','b'],['c'],['d',['a','b'],'f']] 

與此:

l = [x.decode('UTF8') for x in l] 

可能我會得到錯誤:列表對象沒有屬性'解碼'

(「l」從標記文本創建的列表,它的每個單詞都創建了列表對象。嘗試了很多克服解碼困難的解決方案,但仍然無法打印非asc二字符)

with open(path, "r") as myfile: 
    text=myfile.read() 

text = word_tokenize(text) 

d = [[item] if not isinstance(item, list) else item for item in text] 

arr = sum(([[x[0] for x in g]] if k else list(g) 
    for k, g in groupby(d, key=lambda x: x[0][0].isupper())), 
    []) 

arr = [x.decode('UTF8') for x in arr] 

INPUT(我的文本文件):

Çanakkale çok güzel bir şehirdir. Çok beğendik. 

OUTPUT:

[[u'\xc7anakkale'], [u'\xe7ok'], [u'g\xfczel'], [u'bir'], [u'\u015fehirdir'], [u'.']. [u'\xe7ok'], [u'be\u011fendik'], [u'.']] 

我期望的輸出列表,但酷似我的輸入格式。

+0

你需要保留結構嗎? – Natecat

+0

我覺得所以我有很多非ASCII字符,但我想打印它們的確切結構(單詞包含üğşıç) –

+0

請提供[mcve]和設計輸出 –

回答

1

首先,你認爲你有問題,你要打印整個列表(你有沒有包含在你的問題是部分如此我不得不猜測) - Python正在打印數據的安全表示。對你而言,這意味着它表示你有Unicode字符串(因此是u''),並且它顯示了非ASCII字符的Unicode點十六進制值。

如果您要打印列表中的某個部分,那麼您將得到您所期望的。

I.e.

>>> print arr[0][0] 
Çanakkale 

如果你想打印所有的值,你需要一個循環:

for x in arr: 
    for y in x: 
     print y 

你也通過數據解碼手動深在你的代碼帶來不必要的複雜性 - 而不是你應該解碼輸入的數據。

看來,你使用Python 2.x的(由U'前綴),所以使用io模塊,你讀它的文本數據進行解碼:

import io 
with io.open(path, "r", encoding="utf-8") as myfile: 
    text=myfile.read() 

現在,您可以刪除arr = [x.decode('UTF8') for x in arr]行。

+0

很好的解釋整個答案啓示我謝謝 –

2

你可以用簡單的遞歸函數來完成解碼:

l1 = [['a'],['a','b'],['c'],['d',['a','b'],'f']] 

def decode(l): 
    if isinstance(l, list): 
     return [decode(x) for x in l] 
    else: 
     return l.decode('utf-8') 

decode(l1) # [[u'a'], [u'a', u'b'], [u'c'], [u'd', [u'a', u'b'], u'f']] 
+0

謝謝。試過這個,但是我以錯誤的方式創建了這個問題嗎?解碼後的原因(urf-8)我想我會得到的單詞包含(ü»ıç) –

+1

這將有助於,如果你會添加問題的輸入和預期的輸出到問題本身。 – niemmi

+0

我很確定編碼是'utf-8'而不是'UTF8' – Natecat