2017-03-28 12 views
1

私はUnicodeでいくつかの変数を持っています。キリル文字のシンボルとしてUnicodeデータを書き込む方法は?

print (title) 

    Администратор интернет-магазин 

私はCSVファイルにこのデータ(キリル文字記号)を記述しようとすると::

with open('avito.csv','a') as f: 
     writer=csv.writer(f) 
     writer.writerow((title)) 

このエラーが発生します。

を私はこのvaiableを印刷する場合、私が手

title 

u'\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430' 

type(title) 

unicode 

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0410' in position 0: ordinal not in range(128) 

どのように私はTHI書くことができますCSVへのキリル記号としての変数?

+0

エラーメッセージの代わりに2回目のコードを貼り付けました。 – chepner

+1

あなたがユニコードで作業するつもりなら、実際にPython 3を考慮する必要があります。 –

答えて

1

3つの方法。 Excelのファイルを開くには、ファイルの先頭にエンコードされたUTF-8 BOMが好きであることに注意してください。ブルートフォース方式で手動で書きますが、それ以外の場合はutf-8-sigコーデックが処理します。あなたが不足している編集者(Windowsメモ帳)やExcelを扱っていない場合は、BOM署名をスキップしてください。

import csv 
import codecs 
import cStringIO 

title = u'\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430' 
print(title) 

# Brute force 

with open('avito.csv','wb') as f: 
    f.write(u'\ufeff'.encode('utf8')) # writes "byte order mark" UTF-8 signature 
    writer=csv.writer(f) 
    writer.writerow([title.encode('utf8')]) 

# Example from the documentation for csv module 

class UnicodeWriter: 
    """ 
    A CSV writer which will write rows to CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds): 
     # Redirect output to a queue 
     self.queue = cStringIO.StringIO() 
     self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
     self.stream = f 
     self.encoder = codecs.getincrementalencoder(encoding)() 

    def writerow(self, row): 
     self.writer.writerow([s.encode("utf-8") for s in row]) 
     # Fetch UTF-8 output from the queue ... 
     data = self.queue.getvalue() 
     data = data.decode("utf-8") 
     # ... and reencode it into the target encoding 
     data = self.encoder.encode(data) 
     # write to the target stream 
     self.stream.write(data) 
     # empty queue 
     self.queue.truncate(0) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

with open('avito2.csv','wb') as f: 
    w = UnicodeWriter(f) 
    w.writerow([title]) 

# 3rd party module, install from pip 

import unicodecsv 
with open('avito3.csv','wb') as f: 
    w = unicodecsv.writer(f,encoding='utf-8-sig') 
    w.writerow([title]) 
+0

ご協力いただきありがとうございます – egorkh

2

あなたは正しいエンコーディングでファイルに記述する必要があり、そしてあなたのコメントから、私は推測する、それがcp1251です:Pythonの2.7で

import io 
title = u'\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430' 
with io.open('avito.csv', 'a', encoding='cp1251') as output: 
    output.write(title + '\n') 
+0

このコードの後に​​私がこのコードを書いた後、avitoに - РђРґРјРёРЅРёСЃС,СЂР°С,РѕСдёРЅС,РμСдёРСС,РјРРіРР・РёРЅР° 。あなたは、ファイルを読み取るために、使用しないエンコーディングАдминистраторинтернет-магазина – egorkh

+0

- しかし、私はこのキリル文字のテキストを取得したいのですが? – Daniel

+0

@egorkhこの 'u 'РђРґРјРёРЅРёСЃС,СЂР°С,РѕСРёРЅС,РμСЂРЅРμС''は'u'Администраторинтернет-магазина'.encode(' utf8 ')。decode(' cp1251 ') 'です。これは、文字列がutf8として書かれており、cp1251として読み込んでいることを意味します。ダニエルのコードではどうしたらよいでしょうか。 –

関連する問題