質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

2771閲覧

ブラウザでcsvをダウンロードさせる方法【python】

4mmsod

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2015/07/25 03:28

編集2015/07/25 04:57

OS: OS X 10.10.4
Python:2.7.10
nginX
uWSGI
AWS:ec2

pythonの勉強にクローラーを作成している者です。
ローカルでcsvファイルを作成することはできるようになったので、次はサーバを利用してcsvをURLにアクセスした人にダウンロードさせるようなものに変えようとしています。

そこで書いたスクリプトが

-- coding: utf-8 --

from bs4 import BeautifulSoup
import re
import urllib2
import sys
import csv
import codecs
from HTMLParser import HTMLParser
from werkzeug.datastructures import Headers
from werkzeug import Response

def application(environ, start_response):
start_response("200 OK",[('Content-Type','text/html')])

sys.stdout = codecs.getwriter('utf_8')(sys.stdout) filename = "tabelog.csv" writecsv = csv.writer(file(filename, 'w'), lineterminator='\n') sys.stdout = codecs.EncodedFile(sys.stdout, 'utf_8') for ...............#スクレイピング部分は長いので割愛 row = (hoge1,hoge2,hoge3) writecsv.writerow(row) header = Headers() header.add('Content-Type', 'application/octet-stream'); header.add('Content-Disposition', 'attachment', filename='tabelog.csv') return Response(w.getvalue(), headers=header)__**

こんな感じなのですが、実行すると
AttributeError: 'ResultSet' object has no attribute 'getvalue'
とエラーが返ってきます・・・。
サーバにスクリプト載せるのも初めてなので、コピペ頼りで書いたのでかなりおかしいかもしれません。
よろしければご教授お願いします。

追記
すみません、ヘッダフィールド記載ミスです・・・。
start_response("200 OK",[('Content-Type','application/octet-stream')])
です。

追記2
try:
return Response(w.getvalue(),headers=header)
except AttributeError:
return "hoge"
という風に例外処理にしてみたらテキストファイルに"hoge"と入力されて返ってくるようになりました。csvでほしいです・・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

werkzeugのapplicationデコレータを使わないのであれば、Responseを直接返すのではなくて、それをcallしたものを返しましょう。

response = Response(w.getvalue(), headers=header) return response(environ, start_response)

また、start_response() はresponse()の中で呼ばれるので自分で呼んではいけません。

投稿2015/07/25 09:26

sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーメッセージから察するに一番最後の

python

1return Response(w.getvalue(), headers=header)__**

の"w.getvalue()"のところが怪しいように見受けられます。ResultSetオブジェクトにはgetvalueというメソッドは無いと怒られているような気がします。

もしかしたら本来__getValue__というメソッドが__getvalue__になっているから呼び出せない。などというTypoかもしれません。

ソースコードは実行していませんので確証は無いですが、参考になれば幸いです。

投稿2015/07/25 05:53

manzyun

総合スコア2244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

4mmsod

2015/07/25 08:27

ご回答ありがとうございます。 色々修正し、最終的に header = Headers() header.add('Content-Type', 'application/octet-stream'); header.add('Content-Disposition', 'attachment', filename='hoge.csv') print "aaa" と書きました。しかし TypeError: 'NoneType' object is not iterable とでてしまいエラーになります・・・。
manzyun

2015/07/25 08:42

となるとどこかでNoneが代入されている可能性がありそうです。 PyCharmなどの統合開発環境かpdbでステップ実行をして地道にどの変数にNoneが代入されてしまっているのか調べた方が良さそうです。 pdbの使い方はこちらをご覧ください [26.2. pdb — Python デバッガ — Python 2.7ja1 documentation](http://docs.python.jp/2/library/pdb.html)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問