テクノロジーであそぼ!

プログラミング(Python)や投資、仮想通貨についての情報サイト。

【Python x Excel】 めんどくさいExcel作業を自動化しよう!複数データを変更編

f:id:kichie_com:20180404162240j:plain 前回【リンク】の続きです。

実行環境

Python 3.6.3
Mac OS 10.13.3 pipインストール済

使用するモジュール

openpyxl

テストデータ

これからxlsxデータを扱うので以下のデータを元に説明していきます。 15ファイルほどあります。 データダウンロード: https://drive.google.com/open?id=1Il4XpMBwLKHsQbK4360cgC6UXidb6TeK データ内容:f:id:kichie_com:20180404152226p:plain

基本操作は以前の記事を参照して下さい。

複数のデータを読み込む

以前一つのファイルを読み込むことができたので今回は複数のファイルを読み込んでいきましょう。

ファイル構成は以下の通りです。 |
|- main.py
|_ data - data.xlsxが15ファイル

アルゴリズム

複数のファイルを読み込む場合、以前の読み込みから書き込みまでの動作を1ファイルごとに複数回行います。 データをダウンロードした方は15ファイルあるので、15回行うことになります。 ではまず、15ファイルがそれぞれに対して、処理を行うので、それぞれのファイルがどこにあるのかをプログラムで探していきましょう。

ファイルを探すプログラム

以下のプログラムは難易度が少し高いので、そのままコピペしてしまって構いません。

#ファイルを見つけるために必要なモジュール
import os

#変数の初期化
filePath = []

folder = "data"
#folder下のファイルとフォルダを検索
for root, dirs, files in os.walk(folder):
    for fname in files:
#        ファイルのパスを作成
        fnamePath = os.path.join(root, fname)
        #ファイル名に.xlsxという名前があったら
        if fnamePath.find(".xlsx") != -1:
#            filePathに追加
            print(".xlsxファイルがありました!場所: "+fnamePath)
            filePath.append(fnamePath)

if filePath == []:
    print("データがありません!")

print(filePath)
# 出力結果 -> 
['data/data.xlsx', 'data/data10.xlsx', 'data/data11.xlsx', 'data/data12.xlsx', 'data/data13.xlsx', 'data/data14.xlsx', 'data/data15.xlsx', 'data/data2.xlsx', 'data/data3.xlsx', 'data/data4.xlsx', 'data/data5.xlsx', 'data/data6.xlsx', 'data/data7.xlsx', 'data/data8.xlsx', 'data/data9.xlsx']

ファイルを探すことができました。

エラーが出たら確認

ここはエラーがが出やすいのでもしエラーが出てしまったら、ファイル構造がちゃんと以下の様になっているかを確認しましょう。

|
|- main.py
|_ data - data.xlsxが15ファイル

ではこのfilePathに保存されたデータファイルの居場所を使って探していきましょう。 ちなみにファイルの居場所のことを専門用語では「パス(path)」と言います。

filePathに保存されたパスを一つずつ取り出す。

filePathは配列データになっているので、これを一つづつ取り出します。

上のコードに書き足ていきましょう。

...

if filePath == []:
    print("データがありません!")

for path in filePath:
    print(path)
# 出力結果 -> 
#data/data.xlsx
#data/data2.xlsx
#data/data10.xlsx
#    ... 

これで一つづつ出力することができました。

ここまでの技術と前回の基本操作を組み合わせると大量のデータを変更することができます。

大量のデータを変更してみる

流れの確認

dataフォルダの下にあるファイルを検索してパスを保存。(今回は15個のファイル) 15ファイルそれぞれに対して、データの書き込み処理を行う。

実際のプログラム

このコードは今回のコードと、前回の記事のコードを少し変えて書いたものなので、変更した部分にコメントを入れてあります。

import openpyxl as px
import os


#変数の初期化
filePath = []
folder = "data"
#folder下のファイルとフォルダを検索
for root, dirs, files in os.walk(folder):
    for fname in files:
#        ファイルのパスを作成
        fnamePath = os.path.join(root, fname)
        #ファイル名に.xlsxという名前があったら
        if fnamePath.find(".xlsx") != -1:
#            filePathに追加
            print(".xlsxファイルがありました!場所: "+fnamePath)
            filePath.append(fnamePath)

if filePath == []:
    print("データがありません!")

#それぞれのパスを取り出してそのファイルを編集して保存
for path in filePath:
    print(path)
    wb = px.load_workbook(path)  ##ここを変更
    #1番最初のシートを読み込む
    sheetName = wb.sheetnames[0]
    print("■読み込みシート名: "+sheetName)
    sheet = wb[sheetName]
    #値を書き換えて
    sheet["B1"].value = "株式会社パイソン" ##ここを変更
    #データを保存
    wb.save(path) ##ここを変更

これで実行すると全てのファイルのB1のセルの値が書き換わっています。 f:id:kichie_com:20180404160531p:plain

以上です!

もっと知りたい

もっと知りたい方は以下のサイトが非常に参考になります! pythonのopenpyxlの使い方メモ - Qiita Python openpyxlでExcelを操作 - Qiita