【问题标题】:How to write unicode in CSV using Python2如何使用 Python2 在 CSV 中编写 unicode
【发布时间】:2017-05-05 07:19:04
【问题描述】:

我有一个将数据写入 csv 文件的以下 python 代码。

            from StringIO import StringIO
            import unicodecsv as csv

            res_io = StringIO()

            csv_writer = csv.DictWriter(
                res_io, encoding='utf-8', fieldnames=header,
                delimiter=str(','), quoting=csv.QUOTE_NONNUMERIC
            )
            # PyCharm Debugger
            # results: <type 'list'>: [{'review': {u'a': u'foo', u'b': u'bar'}, 'id': '1'}]
            csv_writer.writerows(results)

我在 CSV 中得到的输出,u 前面带有键和值,我在输出 CSV 中不需要它。

CSV 中的预期输出(我已手动编辑以上输出):

【问题讨论】:

  • 最简单的解决方案:改用 Python 3。无论如何,你为什么期望输出是这样的?它是 Python 2 字典的repr,这就是它与 Unicode 字符串一起工作的方式。一种选择是重写整个字典以使用 Python 2 字符串等。
  • 我不明白这里的问题,您希望 'u' 不出现在输出 csv 中吗?这个问题似乎表明了别的东西。
  • 它适用于 Python3,但我正在寻求 Python2.7 的帮助。
  • 是的,我不想在输出 csv 中出现 u
  • 你为什么首先将字典写入 CSV 列?至少然后使用标准格式,如 JSON。或者根本不使用 CSV。

标签: python csv unicode


【解决方案1】:

也许您希望使用 JSON 来实现一致的输出

>>> json.dumps({u'a': u'foo', u'b': u'bar'}, sort_keys=True)
'{"a": "foo", "b": "bar"}'

作为奖励,sort_keys=True 的按键将按字母顺序排列。

from StringIO import StringIO
import unicodecsv as csv
import json

res_io = StringIO()

csv_writer = csv.DictWriter(
    res_io, encoding='utf-8', fieldnames=header,
    delimiter=str(','), quoting=csv.QUOTE_NONNUMERIC
)
# PyCharm Debugger
# results: <type 'list'>: [{'review': {u'a': u'foo', u'b': u'bar'}, 'id': '1'}]
csv_writer.writerows({'id': i['id'],
                      'review': json.dumps(i['review'], sort_keys=True)}
                     for i in results)

【讨论】:

  • 结果不是恒定的,它可能是任意数量的键/值对,为了简化我的问题,我给出了“id”和“review”键的示例,但实际上它可以是任意数量的键/用户存储的值对。
  • @n33rma 所以适应我给你的东西。
【解决方案2】:
from StringIO import StringIO
import csv

res_io = StringIO()
header= ["review","id"]
csv_writer = csv.DictWriter(
    res_io,  fieldnames=header
    #delimiter=str(',')#, quoting=csv.QUOTE_NONNUMERIC
)
csv_writer.writerows([ {k:str(i[k]).replace("u'","'")}if type(i[k])==dict else {k:i[k]} for i in results for k in i ])

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 2016-12-04
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多