Web サーバを Python で作っていて、Pandas DataFrame を CSV ファイルとしてダウンロードさせたいときのメモ。
body = df.to_csv(index=False).encode('utf_8_sig')
headers = {
'Content-Type': 'text/csv',
'Content-Disposition': 'attachment; filename="data.csv"',
}
return web.Response(body=body, headers=headers)
これは aiohttp Server の例だが、他のフレームワークでも同様だと思う。
-
pandas.DataFrame.to_csv
は出力先を指定しなければそのまま CSV 文字列を返してくれる - CSV ファイルが Excel で開かれることが想定される場合は
utf_8_sig
(BOM 付き UTF-8) でエンコードしておくと文字化けしなくて良い -
Content-Disposition
ヘッダを付加することでダウンロード時のファイル名を指定することができる- 日本語ファイル名を使う時はエンコードが必要
このあたりがポイント。