2016-10-31 6 views
2

を使用するために、私は私の出力ファイルを開くフォースPythonの私は、Python 3でCSVモジュールを使用している4桁のUnicodeエンコーディング(CSVライター)

open(file_name, 'w', encoding="ascii", errors="backslashreplace") 

、ファイルにUnicode文字列を書き込みます。 Unicode文字は、のような、六角表現に置き換えられます:

F \ xfcr

残念ながら私のパーサ(JavaScriptが)、この表現を理解し、

Fのようなものを望んでいません\ u00FCr

代わりに(4桁の表記)。これを達成するための巧妙な方法があるのですか?ファイルを再度開いて、すべての出現箇所を見つけて自分で変更する必要がありますか?

説明:JavaScriptパーサが理解できないため、utf-8エンコーディングを使用したくありません。私はUnicode文字をエスケープする必要があります!

+0

私はあなたが "ユニコードエスケープ"エンコーディングを探していると思います。 –

+0

'encoding =" utf-8 "'のために 'encoding =" ascii "'を変えないでしょうか? – lucasnadalutti

+0

いいえ、私はJSパーサーをクラッシュさせる "für"を取得します。私はエンコーディングが必要です。 @ PM2RingこれはCSVモジュールとどのように機能しますか? – user667804

答えて

1

明確化:JavaScriptパーサが理解できないため、utf-8エンコーディングを使用したくありません。

このようなダムパーサーを扱うのは残念です。エンコードされたデータを適切に処理するのではなく、CSVデータをJSONデータとして扱うようです。それは非常に標準ではありません。

あなたが引用符を取り除き、その後JSONに各値をエンコードすることができます

import json, csv 

def json_escaped(obj): 
    res = json.dumps(obj) 
    if res[0] == res[-1] == '"': 
     res = res[1:-1] 
    return res 

with open(file_name, 'w', newline='') as outfile: 
    writer = csv.writer(outfile) 
    for row in source: 
     writer.writerow(map(json_escaped, row)) 

これは、JSONは(ほぼ完全に)のJavascriptのスーパーセットであるため、離れるとき(two exceptionsはPythonのパーサは、これまで生成されません動作しますデフォルトensure_asciiTrueに設定されています)。

backslashreplaceは、UnicodeコードがU + 0100からU + D7FF、U + E000-U + FFFFを指しているだけで、\uhhhhがエスケープするため、機能しません。これらの範囲外のコードポイントは、すでに短いエスケープコード(\n,\xhhなど)またはより長いエスケープコード(以上のものの場合はいずれもの場合)にエンコードされています。

jsonエンコーダは\uhhhhのエスケープコードを生成し、U + FFFFを超えるコードポイントにはUTF-16 surrogate pairsを使用します。

デモ:

>>> import csv 
>>> from io import StringIO 
>>> data = [3.14, 'Unicode face: \u0669(-\u032e\u032e\u0303\u2022\u0303.', 'Something with a non-BMP emoji: \U0001F47D'] 
>>> with StringIO() as output: 
...  writer = csv.writer(output) 
...  writer.writerow(map(json_escaped, data)) 
...  print(output.getvalue()) 
... 
105 
3.14,Unicode face: \u0669(-\u032e\u032e\u0303\u2022\u0303.,Something with a non-BMP emoji: \ud83d\udc7d 

ので、有効なCSVは\uhhhh列に変換ASCII範囲外のものを用いて製造されます。

改行文字も(\n)にエンコードされますが、パーサーがJSONまたはJavascriptリテラルとしてデータを扱っている場合は、問題ではありません。

関連する問題