6

Django を使用して Unicode データ (ギリシャ文字) を含む CSV ファイルを作成し、MS Excel から直接開くようにしたいと考えています。他の場所で unicodecsv ライブラリについて読んだことがあり、それを使用することにしました。これが私の見解です。

def get_csv (リクエスト、ID):
    応答 = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = '添付ファイル; ファイル名=csv.csv'
    ライター = unicodecsv.writer(応答、encoding='utf-16"')
    writer.writerow(['2 行目', 'A', 'B', 'C', '"テスト"', "ελληνικά"])
    応答を返す

ここで、utf-16 を除いて、utf-8、utf-8-sig、utf-8-le、utf-16-le など、ライターのエンコーディング パラメータのすべてを実際に試しました。Excel でファイルを開くたびに、ギリシャ文字があるべき場所にゴミが表示されていました。

Notepad++ は問題なくファイルを開くことができました。私は何を間違っていますか?

更新:jdの回答の後に試したことは次のとおりです。

csvをインポート
応答 = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = '添付ファイル; ファイル名=test.csv'
response.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(response, delimiter=';' , dialect='excel')
writer.writerow(['2 行目', 'A', 'B', 'C', '"テスト"', "ελληνικά"])
応答を返す

まだ運がありません-ExcelでBOM(グラバージとして)も表示できるようになりました-unicodecsvと他のいくつかのオプションを使用してみましたが、もう一度何も機能しませんでした:(

更新2:ddaの提案の後にこれを試しました:

ライター = unicodecsv.writer(応答、区切り文字 =';'、方言 ='excel')
writer.writerow(codecs.BOM_UTF16_LE)
writer.writerow([ (u'ελληνικά').decode('utf8').encode('utf_16_le')])

まだ運がありません:(これが私が得るエラーです:

/csv/559 の UnicodeEncodeError
'ascii' コーデックは位置 0 ~ 7 の文字をエンコードできません: 序数が範囲外です (128)

更新 3: 気が狂いそうです。なんでこんなに難しいの??? 別の試みは次のとおりです。

response.write(codecs.BOM_UTF16_LE)
writer = unicodecsv.writer(response, delimiter=';' , lineterminator='\n', dialect='excel', )
writer.writerow('ελληνικ')
writer.writerow([ ('ελληνικά').decode('utf8').encode('utf_16_le')]) #A
writer.writerow([ ('ελληνικά2').decode('utf8').encode('utf_16_le'), ('ελληνικά2').decode('utf8').encode('utf_16_le') ]) #B

そして、ここにExcelの内容があります:

㯎㮵㯎㮻㯎㮻㯎㮷㯎㮽㯎㮹㯎઺εληνικά딊묃묃뜃봃뤃먃갃㈃딻묃묃뜃봃뤃먃갃㈃

それで、#A という行でいくつかのギリシャ文字を取得しました。しかし、まったく同じ行 B では、ギリシャ文字が生成されませんでした $^#$#^$#$#^ @@%$#^#^$#$ Pls hlep !

4

2 に答える 2

12

Python のcsvモジュールでは、ファイルの先頭に BOM を配置すると、Excel が正しく読み取る UTF-8 ファイルを記述できます。

with open('myfile.csv', 'wb') as f:
    f.write(u'\ufeff'.encode('utf8'))
    writer = csv.writer(f, delimiter=';', lineterminator='\n', quoting=csv.QUOTE_ALL, dialect='excel')
    ...

同じことが動作するはずunicodecsvです。BOM をHttpResponseオブジェクトに直接書き込むことができると思いますが、そうでない場合はStringIO、最初にファイルを書き込むために使用できます。

編集:

非 ASCII 文字を含む UTF-8 CSV ファイルを書き込むサンプル コードを次に示します。簡単にするために、Django を方程式から外しています。そのファイルを Excel で読み取ることができます。

# -*- coding: utf-8 -*-
import csv
import os
response = open(os.path.expanduser('~/utf8_test.csv'), 'wb')
response.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(response, delimiter=';' , dialect='excel')
writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', u"ελληνικά".encode('utf8')])
response.close()
于 2012-06-01T07:29:04.157 に答える