明確化: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_ascii
はTrue
に設定されています)。
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リテラルとしてデータを扱っている場合は、問題ではありません。
私はあなたが "ユニコードエスケープ"エンコーディングを探していると思います。 –
'encoding =" utf-8 "'のために 'encoding =" ascii "'を変えないでしょうか? – lucasnadalutti
いいえ、私はJSパーサーをクラッシュさせる "für"を取得します。私はエンコーディングが必要です。 @ PM2RingこれはCSVモジュールとどのように機能しますか? – user667804