从CSV读取Unicode

时间:2013-07-08 11:41:53

标签: python csv unicode

我在从csv中读取unicode字符时遇到问题。 csv文件最初具有带unicode标记的元素:

  1. "[u'Aeron\xe1utica']"
  2. "[u'Ni\u0161']"
  3. "[u'K\xfcnste']" ...
  4. 我必须从中删除你的''使用

    提供csv的标签
    1. Aeron\xe1utica
    2. Ni\u0161
    3. K\xfcnste ....
    4. 现在我想读取csv并将其输出到带有字符的文件中。

      1. Aeronáutica
      2. Niš
      3. Künste ....
      4. 我尝试在csv docs中使用UnicodeWriter,但它提供与第二个列表相同的输出

        这是我读写的内容:

        c = open('foo.csv','r')
        r = csv.reader(c)
        for row in reader:
        p = p + row
        #The elements in p were ['Aeron\\xe1utica', 'Ni\\u0161', 'K\\xfcnste'...]
        c = open('bar.csv','w')
        c.write(codecs.BOM_UTF8)
        writer = UnicodeWriter(c)
        for row in p:
        writer.writerow([row])
        

        我还尝试过codecs.open('''''' UTF-8')进行阅读和写作,但它没有&#39 ; t help

1 个答案:

答案 0 :(得分:0)

您似乎已将Python列表直接写入CSV文件,从而产生[...]文字语法而非普通列。然后,您删除了可能用于将信息再次转换为带有unicode字符串的Python列表的大部分信息。

你剩下的是Python unicode文字,但没有引号。使用unicode_escape再次将值解码为Unicode:

with open('foo.csv','r') as b0rken
    for line in b0rken:
        value = line.rstrip('\r\n').decode('unicode_escape')
        print value

或添加回u'..'引用,使用三引号字符串以避免需要转义嵌入式引号:

with open('foo.csv','r') as b0rken
    for line in b0rken:
        value = literal_eval("u'''{}'''".format(line.rstrip('\r\n')))
        print value

如果您仍然拥有原始文件(使用[u'...']格式化的行),请使用ast.literal_eval()函数将其转换回Python列表。这里使用CSV模块没有意义:

from ast import literal_eval

with open('foo.csv','r') as b0rken
    for line in b0rken:
        lis = literal_eval(line)
        value = lis[0]
        print value

使用unicode_escape进行演示:

>>> for line in b0rken:
...     print line.rstrip('\r\n').decode('unicode_escape')
... 
Aeronáutica
Niš
Künste
École de l'Air