bottleでCSVファイルをダウンロードさせるときにつまづいたところ

やろうとしたこと

前回(bottleでテンプレートを継承してみる。)からの続きで、
TogglのデータをPandasを用いてDataFrameにして、DataFrameをさらにCSVの形式にしてダウンロードさせようとしました。
結果として、1日以上かかりましたが、解決策が見えたのでまとめておきます。

つまづいた原因

最初は、DataFrameの形式をCSVでダウンロードするためにデータの型の変換がうまくいっていないのではないかと思い、試行錯誤していました。
以下のように、POSTで「/」のページにアクセスしたときに、CSVファイルをダウンロードさせようとしていました。
この『POSTで「/」のページにアクセスしたときに、CSVファイルをダウンロード』というのがそもそも無理っぽいことが分かりました
(僕のWebに関する知識が足りていなかったです)。

以下のエラーコードが表示されました。
このエラーコードは、『TypeError( ‘引数1には “write”メソッドが必要です)』(Google翻訳より)という意味で、
このエラーコードから、DataFrameの形式をCSVでダウンロードするためにデータの型の変換がうまくいっていないのではないかと思いました。
(他にもいろいろ試して、他のエラーコードが表示されたような気もしますが…。また、エラーコードの解釈として正しいかどうかは分かりません…。)

(参考ページ)
Django、CSVのインポート・エクスポート

解決策

DataFrameをCSVでダウンロードするには、Pandasのto_csv()でCSVに変換すればいけることが分かりました。
また、『POSTで「/」にアクセスしたとき』ではなく、ファイルをダウンロードするURLを別URLで定義してあげて、そのURLにアクセスするとファイルがダウンロードできることが分かりました。
試しに、「/」から「/download」にアクセスしたときにCSVファイルをダウンロードするようなテストコードを組んでみると問題なく動きました。
こういう小さなテストって大事ですね!

以下のページが表示されるので、リンクをクリックするとファイルがダウンロードされます。

ここに至るまでにいろいろ試してみました(主に、DataFrameをCSVの形式でダウンロードするにはどうすればいいか、ということです)。
参考までに試してみたことを以下にまとめておきます。

試してみたことその1

いろいろ試していて、「データ型が文字型じゃない」とエラーが出たので、StringIOというパッケージを使ってみました。

同じエラーが出ます。

(参考ページ)
【Python】Bottleを使ってCSVダウンロードする方法
Bottleでファイルをダウンロードさせる
Use Flask to convert a Pandas dataframe to CSV and serve a download

試してみたことその2

Excel形式にしてダウンロードしていたコードがあったので試してみました。

以下のエラーコードが表示されました。

(参考ページ)
Django Pandas to http response (download file)

試してみたことその3

bodyにto_csv()で書き出したCSVファイルを指定してみました。

エラーは表示されないのですが、POSTで「/」でアクセスするとファイルがダウンロードされず、以下のページ(テンプレートのHTMLページ)が表示されます。

(参考ページ)
[技術][Python]Flask で CSV 出力(修正版) 

その他参考記事

pandas.DataFrame.to_string
Django Class-based views でCSVダウンロードページの実装ではまったこと
Python + Bottle でファイルのダウンロードを実装
BottleのRequest/Responseオブジェクトをマスター

今後やること

今回の知見を基に、CSVファイルをダウンロードできるようにコードを書き換えます。
その後、BootStrapを用いて少しデザインをいじったり、JavaScriptを用いてフロント側の機能を実装していきます。
その後は、いよいよデプロイします。

コメント

タイトルとURLをコピーしました