現在、io モジュールのドキュメントを読んでいます: https://docs.python.org/3.5/library/io.html?highlight=stringio#io.TextIOBase
Python をよく知らないからかもしれませんが、ほとんどの場合、Python のドキュメントを理解していません。
データをaddresses_list
csv ファイルに保存し、https 経由でユーザーに提供する必要があります。したがって、これらはすべてメモリ内で発生する必要があります。これはそのコードで、現在は正常に動作しています。
addresses = Abonnent.objects.filter(exemplare__gt=0)
addresses_list = list(addresses.values_list(*fieldnames))
csvfile = io.StringIO()
csvwriter_unicode = csv.writer(csvfile)
csvwriter_unicode.writerow(fieldnames)
for a in addresses_list:
csvwriter_unicode.writerow(a)
csvfile.seek(0)
export_data = io.BytesIO()
myzip = zipfile.ZipFile(export_data, "w", zipfile.ZIP_DEFLATED)
myzip.writestr("output.csv", csvfile.read())
myzip.close()
csvfile.close()
export_data.close()
# serve the file via https
問題は、csv ファイルの内容をutf-8ではなくcp1252でエンコードする必要があることです。伝統的に、私はすべてのデータを書き込んでそこにダンプしていました。しかし、メモリ内ストリームでは、そのようには機能しません。両方とも、パラメータを取らないでください。f = open("output.csv", "w", encoding="cp1252")
io.StringIO()
io.BytesIO()
encoding=
これは、ドキュメントを理解するのに苦労している場所です。
テキスト ストリーム API については、TextIOBase のドキュメントで詳しく説明されています。
そしてTextIOBase のドキュメントには次のように書かれています:
エンコーディング=
ストリームのバイトを文字列にデコードし、文字列をバイトにエンコードするために使用されるエンコーディングの名前。
しかし、io.StringIO(encoding="cp1252")
単にスローします: TypeError: 'encoding' is an invalid keyword argument for this function
.
では、TextIOBase のエンコンディング パラメータを StringIO で使用するにはどうすればよいでしょうか。または、これは一般的にどのように機能しますか?私はとても混乱しています。