2009-10-13 29 views
0

基本上,我今天一直在玩這個遊戲。我有一個名爲test.csv這個數據文件,該文件被編碼成UTF-8:從Python中的.CSV檢索並顯示UTF-8

「阮」,0.500 「過渡」,0.250 「樂」,0.250

現在我試圖與讀它這段代碼和它顯示所有這樣的有趣:Trần

現在我已經經歷了2.6的所有Python文檔,這是我使用的,我不能讓包裝與所有的想法一起工作我假設的互聯網都是非常正確的,只是沒有被你的真正適用。從好的一面,我瞭解到,不是所有的字體都能正確顯示那些字符,無論如何我以前沒有想到過,並且學到了很多關於Unicode的知識,所以它肯定不會浪費時間。

如果有人能指出我出錯的地方,我將非常感激。

這裏是更新每低於要求的代碼返回此錯誤 -

 
Traceback (most recent call last): 
    File "surname_generator.py", line 39, in 
    probfamilynames = [(familyname,float(prob)) for familyname,prob in unicode_csv_reader(open(familynamelist))] 
    File "surname_generator.py", line 27, in unicode_csv_reader 
    for row in csv_reader: 
    File "surname_generator.py", line 33, in utf_8_encoder 
    yield line.encode('utf-8') UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128) 
from random import random 
import csv 

class ChooseFamilyName(object): 
def __init__(self, probs): 
    self._total_prob = 0. 
    self._familyname_levels = [] 
    for familyname, prob in probs: 
     self._total_prob += prob 
     self._familyname_levels.append((self._total_prob, familyname)) 
    return 

def pickfamilyname(self): 
    pickfamilyname = self._total_prob * random() 
    for level, familyname in self._familyname_levels: 
     if level >= pickfamilyname: 
      return familyname 
    print "pickfamilyname error" 
    return 

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs): 
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data), 
         dialect=dialect, **kwargs) 
for row in csv_reader: 
    # decode UTF-8 back to Unicode, cell by cell: 
    yield [unicode(cell, 'utf-8') for cell in row] 

def utf_8_encoder(unicode_csv_data): 
    for line in unicode_csv_data: 
     yield line.encode('utf-8') 

familynamelist = 'familyname_vietnam.csv' 
a = 0 
while a < 10: 
    a = a + 1 
probfamilynames = [(familyname,float(prob)) for familyname,prob in unicode_csv_reader(open(familynamelist))] 
familynamepicker = ChooseFamilyName(probfamilynames) 
print(familynamepicker.pickfamilyname()) 

回答

2

unicode_csv_reader(open(familynamelist))正試圖將非Unicode數據(使用utf-8編碼的字節字符串)傳遞給您希望得到unicode數據的函數。你可以用codecs.open(來自標準庫模塊編解碼器)解決這個問題,但這是迂迴的:編解碼器會爲你做utf8-> unicode,那麼你的代碼會做unicode-> utf8,有什麼意義?

取而代之的是一個功能更喜歡這個...:

def encoded_csv_reader_to_unicode(encoded_csv_data, 
            coding='utf-8', 
            dialect=csv.excel, 
            **kwargs): 
    csv_reader = csv.reader(encoded_csv_data, 
          dialect=dialect, 
          **kwargs) 
    for row in csv_reader: 
     yield [unicode(cell, coding) for cell in row] 

,並使用encoded_csv_reader_to_unicode(open(familynamelist))

+0

這個效果很好。但是,我意識到我可以改進我所做的並使之更加清潔。 – MDA1973 2009-10-14 12:13:34

-2

有一個在Python文檔的unicode_csv_reader演示: http://docs.python.org/library/csv.html

+0

讀取「Unicode字符串」。他有用UTF-8編碼的str字符串。如果他們在cp1252中編碼,你會建議「unicode_csv_reader」? – 2009-10-13 23:51:42

1

當前的問題是,你已經獲得了csv_unicode_reader的東西。正如其名,並作爲文件明確規定:

「」「(unicode_csv_reader()下面是一臺發電機,它包裝csv.reader來處理Unicode CSV數據(Unicode字符串列表)。‘’」

你沒有Unicode字符串,你必須在UTF-8編碼字符串STR

建議:吹走csv_unicode_reader東西顯然,簡單地獲取每一行,就好像它是在ASCII編碼然後將每個行。到unicode:

unicode_row = [field.decode('utf8') for field in str_row] 

回到原來的問題:

(1)要獲得有關字體等的幫助,您需要說明您正在運行的平臺以及您用來顯示unicode字符串的軟件。 (2)如果需要檢查數據的平臺無關的方法,請查看repr()內置函數以及unicodedata模塊中的名稱函數。

+0

感謝您花時間回答我的問題。我已經回到了繪圖板,現在更簡單的代碼還有很多。有一件事我沒有意識到,在搜索之前,記事本正在編碼的方式導致我的一些最初的問題。 – MDA1973 2009-10-14 11:42:55

相關問題