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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3754閲覧

Pythonで CSVをCGIからPandasにファイルごと読み込む方法

KenMizu

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/02/06 01:35

お世話になります。

Python3.5.2
win7 64bitの環境です。

1000行×6列のcsvファイルのデータをPandasに読み込ませる作業を行っています。

ローカル環境にて、
PCのディレクトリ指定から読み込むことは、下記のコードにて
問題なく動作できています。

#coding:utf-8 import pandas as pd if __name__ == '__main__': filepath = "C:\\user\\cgi-bin\\20170205123938.csv" df = pd.read_csv(filepath, encoding="CP932") pd_len = len(df) print('Content-type: text/html\n\n') print(pd_len) #1000

同じ作業を、
PCのディレクトリからではなく、
htmlのformタグからcsvファイルを指定し、
読み込む作業を、下記のコードにて行いました。

CSVファイルを1行ずつ読み込むコードのせいか、
読み込みが安定しません。

認識している問題点は2点です。

1.読み込みの行数が不安定です。
200行や600行など、まちまちの行数で止まったり、
1000行全部を読み込める時もあります。

2.ファイルを読み込んだ後にスクレイピングをしているのですが、
スクレイピングの動作がTimeOutしたり、しなかったりします。

CSVファイルを1行ずつ読み込むのではなく、
ファイルごと読み込む方法はありませんでしょうか?

また、もしくは、下記のコードの
どこを修正すれば、安定しますでしょうか?

<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> <form method="post" action="cgi-bin/yahoo_ean.py" enctype="multipart/form-data"> <p>csvファイルを選択してください<br> <input type="file" name="y_csv"></p> <input type="submit" name="submit" /><br /><br /> </form> </body> </html>

↓↓↓formタグを受け取り

#coding:utf-8 import pandas as pd import cgi if __name__ == '__main__': form = cgi.FieldStorage() fileitem = form["y_csv"] in_data = [] if fileitem.file: linecount = 0 while True: line = fileitem.file.readline() if not line: break linecount = linecount + 1 line = line.decode('CP932') line = line.split(",") in_data.append(line) df = pd.DataFrame(in_data) pd_len = len(df) print('Content-type: text/html\n\n') print(pd_len) #読み込む行数が不安定です

どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

while文の中で、readline() を行っており、流れがおかしい気がします。

fileitem.file は、直接for文で繰り返しできるので以下のように行ったほうが良いと思います。

python

1for line in fileitem.file: 2 line.decode('cp932') 3...

投稿2017/02/16 09:17

terapyon

総合スコア313

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

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

KenMizu

2017/03/05 15:28

terapyon さま お返事遅くなり申し訳ございませんでした。 たしかに、While ではなく、For文にすべきです。 ありがとうございます。 ちょうど、別のコードでもWhile True文で思う通りに動作しないコードもありますので、合わせて検証してみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問