【问题标题】:Read Unicode from CSV [duplicate]从 CSV 读取 Unicode [重复]
【发布时间】:2013-07-08 11:41:52
【问题描述】:

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

  1. "[u'Aeron\xe1utica']"
  2. "[u'Ni\u0161']"
  3. "[u'K\xfcnste']" ...

我必须从中删除 u'' 标签以提供 csv

  1. Aeron\xe1utica
  2. Ni\u0161
  3. K\xfcnste ....

现在我想读取 csv 并将其输出到包含字符的文件中,即

  1. Aeronáutica
  2. Niš
  3. Künste ....

我尝试在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') 进行读写,但没有帮助

【问题讨论】:

  • 不,您确实不需要需要删除u。这些是 Unicode 值,您想要 unicode 值。
  • 当读取带有编码字符的 CSV 文件时,为什么不使用UnicodeReader
  • 澄清一下:[u'Aeron\xe1utica'] 是文件中的文字 - 如果不是 - 是什么?
  • @MartijnPieters 有必要删除它们。我在电子表格中删除了它们。
  • @KBhokray:然后你在创建电子表格时做错了。您正在查看 repr() 字符串表示形式,这是一种调试辅助工具。将列表转换为字符串时(例如打印时),所有内容都显示为repr() 值,这是一个str 值,表示每个元素的实际内容。

标签: python csv unicode


【解决方案1】:

您似乎已将 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

【讨论】:

  • 谢谢,差不多了,不过有点小问题。某些元素中已经包含 ' 字符,例如:\xc9cole de l'Air。这给出了错误 File "", line 1 u'\xc9cole de l'Air' ^ SyntaxError: invalid syntax 当然,我可以很容易地用它来代替它,但是任何直接的方法都会更有帮助
  • @KBhokray:只需使用unicode_escape 方法或使用三引号字符串。
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2015-03-27
  • 2018-10-23
  • 2016-12-30
  • 2016-12-21
相关资源
最近更新 更多