no-image

pythonのopenpyxlモジュールを使ってエクセル操作【7時間目:集計の続き】

Pythonでエクセルファイルの集計をする

【6時間目:集計】では膨大なセルがあるエクセルシートから辞書を作成しました。今回の章では膨大な辞書からpyファイルを作成し、それをモジュールとして使用できるようにします。

前回の内容を参照するには「pythonのopenpyxlモジュールを使ってエクセル操作【6時間目:集計】」をご覧ください。

前回と同じコードです。

import openpyxl, pprint, os
print('ワークブックを開いています。')
wb = openpyxl.load_workbook('censuspopdata.xlsx')
sheet = wb.get_sheet_by_name('Population by Census Tract')
county_data = {}

#county_dataに人口と地域数を格納する
print('行を読み込んでいます')
for row in range(2, sheet.max_row + 1):
 state = sheet['B' + str(row)].value
 county = sheet['C' + str(row)].value
 pop = sheet['D' + str(row)].value
 
#新しいテキストファイルを開き、county_dataの内容を書き込む
#州のキーが確実に存在するようにする。
 county_data.setdefault(state, {})
#州の郡のキーが確実に存在するようにする
 county_data[state].setdefault(county, {'tracts': 0, 'pop':0})
 county_data[state][county]['tracts'] += 1
 county_data[state][county]['pop'] += int(pop)

#新しいテキストファイルを開き、county_dataの内容を書き込む
print('結果を書き込み中...')
result_file = open('census2010.py', 'w')
result_file.write('all_data = ' + pprint.pformat(county_data))
result_file.close()
print('完了')

pprint.pfomatを使う

  1. 24行目では新たにcensus2010.pyを作成しています。ファイルを作成するには書き込みモードで開かないといけないので ‘w’ という引数を渡しています。
  2. write(‘all_data = ‘ + pprint.pformat(county_data))で辞書の内容をファイルに書き込みます。
  3. file.close()でファイルを閉じます。
  4. これでcensus2010.pyファイルがカレントディレクトリに作成されたはずです。

問題は、pprint.pformat()のところです。こうすることで、pyファイルがモジュールとして使用できるようになるみたいです。pprint.pformat()の中で何が行われているのかまでは僕レベルでは説明できません。

ためしにモジュールとして使用しています。今回はインタラクティブシェルで入力しています。

import census2010

census2010.all_data['AL']['Autauga']
#: {'pop': 54571, 'tracts': 12}

人口が集計されているのがおわかりいただけますでしょうか?ALは州でAutaugaは郡です。tractsは地域の数です。このエクセルファイルは外国の地域情報ですので少々わかりにくいかもしれん。

このプログラムやモジュールは嬉しい人にとっては嬉しいかもしれません。あまり使い道はないかもしれませんが、
集計が好きな人や仕事でももしかしたら使える?かもしれません。

ただ懸念材料があります。エクセルファイルのデータを追加したらまた一からプログラムを書き直さないといけないかもしれません。現実問題、エクセルファイルにデータを追加してみたら、やはりエラーが発生しました。

census2010['TO']['tokyo']#エラーがでる

エクセルファイルを書き直したら、またcensus2010.pyファイルを作成しなければならず、かなり使えないプログラムだと思います。とはいえこういうことができるということは勉強になったのではないかと思います。

集計の内容は以上になります。またなにか面白いプログラムがあったら上げたいと思います。