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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2364閲覧

Python DataFrameをExcelに…

naomaruJr

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/06 11:14

編集2019/08/07 04:02

Pythonのスクレイピングについて
あるHTMLから複数データを抽出し、pandasのDataFrameに格納しました。
そのDataFrameをExcelシートに出力したところ、上手くはいくのですが毎回データが書き換わってしまいます。

実装したい運用としては、都度別シートに抽出したデータを更新(保存)していくイメージです。

個人的に調べてみても、
pandasのExcelWriterでは、データを上書きしてしまうみたいなので、
openpyxlを使ってみましたが、上手くいきませんでした…

対象のソースコードです。

Python

1 2import requests 3from bs4 import BeautifulSoup 4import pandas as pd 5import xlsxwriter 6import openpyxl as opx 7 8pages = 1 9 10data = [] 11data1 = [] #デイリー 12data2 = [] #週刊 13data3 = [] #月間 14data4 = [] #年間 15genre = "" 16path = r"C:パス" 17wb = opx.load_workbook(path) 18 19#メイン処理を行う 20def mainData(baseURL,pages): 21 while pages <= 5: 22 url = baseURL + str(pages) 23 OpenURL = requests.get(url) 24 content = OpenURL.content 25 soup = BeautifulSoup(content, 'html.parser') 26 27 for div in soup.select("div.desc"): 28 title = div.a.string 29 users = div.select_one(".info-users").span.get_text(strip=True) 30 author = div.select_one(".itemInfoElmBox").a.string 31 32 data.append( 33 { 34 "title": title, 35 "users": users, 36 "author": author, 37 } 38 ) 39 next 40 41 pages += 1 42 return data 43 44#データ4回*4(ジャンル) 45for i in range(4): 46 if i == 0: 47 genre = "book" 48 49 elif i == 1: 50 genre = "bunko" 51 52 elif i == 2: 53 genre = "shinsho" 54 55 elif i == 3: 56 genre ="comic" 57 58 for config in range(4): 59 if config == 0: 60 baseURL = "https://booklog.jp/ranking/" + genre + "?page=" 61 data1 = mainData(baseURL,1) 62 data = [] #初期化 63 64 elif config == 1: 65 baseURL ="https://booklog.jp/ranking/weekly/201908/1/" + genre + "?page=" 66 data2 = mainData(baseURL,1) 67 data = [] #初期化 68 69 elif config == 2: 70 baseURL ="https://booklog.jp/ranking/monthly/201907/" + genre + "?page=" 71 data3 = mainData(baseURL,1) 72 data = [] #初期化 73 74 elif config == 3: 75 baseURL = "https://booklog.jp/ranking/annual/2018/" + genre + "?page=" 76 data4 = mainData(baseURL,1) 77 data = [] #初期化 78 79 books1 = pd.DataFrame(data1) 80 books2 = pd.DataFrame(data2) 81 books3 = pd.DataFrame(data3) 82 books4 = pd.DataFrame(data4) 83 84 with pd.ExcelWriter(path)as writer: 85 books1.to_excel(xlsxwriter, sheet_name=genre+'デイリー') 86 books2.to_excel(xlsxwriter, sheet_name=genre+'週間') 87 books3.to_excel(xlsxwriter, sheet_name=genre+'月間') 88 books4.to_excel(xlsxwriter, sheet_name=genre+'年間') 89 90 91 92 93 94

上記ソースコードみたく、DataFrameを対象シートのA1にそのまま出力し、
次に実行した際にもpathにあるExcelの別シートに更新する方法は可能でしょうか。
ご教示いただきたく存じます。

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

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

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

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

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

meg_

2019/08/06 12:53

「openpyxlを使ってみましたが、上手くいきませんでした…」とのことですが、何をトライされて どう上手くいかなかったのでしょうか?
naomaruJr

2019/08/06 13:08

ご質問ありがとうございます。 openpyxlで対象のExcelを開き、pandasのTo_Excelで書き込もうと試みましたが、 オブジェクトが存在しないとエラーが起きてしまいました。 ファイルパスの指定に誤りがあるのではないかと推察しましたが、 試しにopenpyxlで開いたExcelのA1セルに文字を出力するコードを書いたら問題なく実行できたので、 pandasのDataFrameを扱う場合、特殊なコードが必要ではないかと考えています。。
meg_

2019/08/06 13:24

openpyxlのチュートリアルを呼んで書き込み処理のコードを書きましょう。
meg_

2019/08/06 13:29

openpyxlでは2つのブック間でのシートのコピーは出来ないようです。残念!(出来ればxlsxwriterで作成して、それをopenpyxlでコピーすれば良いと思ったのですが・・・)
naomaruJr

2019/08/06 15:45

何度もご回答頂きありがとうございます。 openpyxlで指定したエクセルに新規でシートを追加することはできるのですが、 pandasのDataFrameの書き込みの処理を加えるとオブジェクトエラーが発生してしまいます。汗 もう少しopenpyxlについて調べてみます。
meg_

2019/08/06 16:38

回答にも追記しましたが、ExcelWriterをmode='a'で作成しても書き込み出来ませんでしたか?(すみませんがこちらで試してはないです)
naomaruJr

2019/08/07 04:05 編集

コメント頂きありがとうございます。 一旦修正前の赤裸々のソースコードを載せました。 mode='a'でも実行できなかったため、根本的なところが誤っている可能性が考えられました。。 (いろいろとインポートしていますが、wb等の変数は使っていません。)
guest

回答1

0

【追記】
こちらのコードで私の環境では出来ました。 *engine指定をしました(Windows10、Excel2016)

python

1with ExcelWriter('path_to_file.xlsx',engine='openpyxl', mode='a') as writer: 2... df.to_excel(writer, sheet_name='Sheet3')

デフォルト設定ではxlsxファイルを指定しても、何故かopenpyxlとならないようで、シート追加不可のエラーが出ました。

【追記修正】pandas(0.25.0)のチュートリアルより
下記で既存のエクセルに追記出来るとのこと

python

1 2You can also append to an existing Excel file: 3 4>>> with ExcelWriter('path_to_file.xlsx', mode='a') as writer: 5... df.to_excel(writer, sheet_name='Sheet3')

※default is to use xlwt for xls, openpyxl for xlsx

ところで、xlsxwriterがモジュール名とpd.ExcelWriterオブジェクト名で重複してるように見えるのですが大丈夫ですか?

【前回の回答】
openpyxlのチュートリアルです。(英語)
https://openpyxl.readthedocs.io/en/stable/tutorial.html

from openpyxl import load_workbook
wb = load_workbook('test.xlsx')
ws = wb.create_sheet("Mysheet") 新規シートを追加(末尾に追加)
書き込み等の処理
wb.template = False
wb.save('document.xlsx')

※書き込み等の処理については多岐にわたるためチュートリアルを参照ください

投稿2019/08/06 13:22

編集2019/08/07 04:58
meg_

総合スコア10580

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

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

naomaruJr

2019/08/08 06:45

ご連携頂いたソースコードを、上記のソースコード(本のランキングを取得するもの)に組み込んでみましたが、上手くいくことができませんでした。 解決には至りませんでしたが、色々とご協力いただきありがとうございました。 もう1度勉強しなおしてみます。
meg_

2019/08/08 09:14

上記のソースコードに組み込むのではなく、単独で実行しても駄目ですか? 適当なエクセルファイルを1つ作って、それにpythonスクリプトからデータフレームの追記が出来なければ環境の問題かもしれませんね。 出来るなら、pandas.ExcelWriterの作り方には問題無いことになります。 あとはエラーメッセージを注意深く読んでみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問