2017-05-05 5 views
-1

私は以下のコードを持っています。これはcsvファイルにデータを書き出します。Python2を使ってCSVでユニコードを書く方法

  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であることは必要ありません。

enter image description here

CSVで

の予想される出力(私は手動出力の上に編集した):

enter image description here

+1

最も簡単な解決策:代わりにPythonの3を使用します。いずれにしても、なぜその出力が期待されますか?それはPython 2辞書の 'repr'です。つまり、Unicode文字列で動作する方法です。 1つのオプションは、Python 2の文字列などを使用するために辞書全体を書き換えることです。 –

+0

私はここで質問をundestandしないで、あなたは出力csvに表示されないようにしたいですか?問題は何かを示唆しているようです。 – Satyadev

+0

Python3で動作しますが、Python2.7のヘルプを求めています。 – n33rma

答えて

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) 
+0

結果は一定ではありません、それは私の質問を簡略化するために、私は 'id'と 'review'キーの例を挙げましたが、実際にはユーザーによって格納された任意の数のキー/値のペアになることができます。 – n33rma

+0

@ n33rma私はあなたに与えたものから順応します。 –

0
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 ]) 
関連する問題