从Python中的.CSV检索和显示UTF-8

时间:2009-10-13 17:46:41

标签: python utf-8 csv

基本上我今天一直很开心。我有一个名为test.csv的数据文件,编码为UTF-8:

“Nguyễn”,0.500 “Trần”,0.250 “Lê”,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())

3 个答案:

答案 0 :(得分:1)

unicode_csv_reader(open(familynamelist))正在尝试将非unicode数据(使用utf-8编码的字节字符串)传递给您编写的期望unicode数据的函数。你可以用codecs.open(来自标准库模块编解码器)来解决这个问题,但那就是回旋:编解码器会为你做utf8-&gt; unicode,然后你的代码会做unicode-&gt; 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))

答案 1 :(得分:0)

您的当前问题是您已经获得了csv_unicode_reader thingy的bum steer。顾名思义,并且文档明确说明:

“”“(下面的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模块中的name函数。

答案 2 :(得分:-2)

python文档中有unicode_csv_reader演示: http://docs.python.org/library/csv.html