ExcelファイルをPythonで読み書きしてみる

データの活用

こんにちは。前回はCSVファイルをPythonで読み書きしました。

すべてのデータがCSVで与えられたり、CSVで使ったりするとは限りません。

今回はExcelで読み書きできるようにしていきます。

OpenPyXLを使ってExcelファイルのデータを読み込む

やはり・・・ですが、ライブラリを使います。ここではOpenPyXLを使ってみます。

Excelファイルを開くとしてもデータが必要なので、埼玉県オープンデータポータルサイトからExcelのファイルをダウンロードして、使うことにします。

今回は、埼玉県内のAED設置場所情報を使います。

それでは、プログラムです。プログラム中の変数 filename で指定しているファイル名は平成31年3月末現在でのデータのファイル名になります。

import openpyxl

file = 'aedh3103.xlsx'
book = openpyxl.load_workbook( file )

sheet = book.worksheets[0]

for row in sheet.rows:
  print( row[2].value, row[4].value, row[6].value, row[7].value )

9行目でrow[*].valueと個別にデータを拾っているのは、名称・住所・緯度・経度だけ表示すればいいかな、って理由です。

実行結果は次のようになります。

設置場所_名称 設置場所_住所 設置場所_緯度 設置場所_経度
埼玉県立浦和第一女子高等学校 埼玉県さいたま市浦和区岸町3-8-45 35.8527170214377 139.658443258888
埼玉会館 埼玉県さいたま市浦和区高砂3-1-4 35.8574965870084 139.651975281295
地方職員共済組合埼玉診療所 埼玉県さいたま市浦和区高砂3-14-21 35.8583774804626 139.647567564525
地方職員共済組合埼玉診療所 埼玉県さいたま市浦和区高砂3-14-21 35.8583044342185 139.647607841841
埼玉県庁 埼玉県さいたま市浦和区高砂3-15-1 35.8570040641145 139.649057771358
埼玉県庁 埼玉県さいたま市浦和区高砂3-15-1 35.8587141414799 139.648769115455
(以下省略)

すべてのデータを表示するには、次のようになります。

import openpyxl

file = 'aedh3103.xlsx'
book = openpyxl.load_workbook( file )

sheet = book.worksheets[0]

for row in sheet.rows:
    for col in row:
        print( col.value )

実行結果については、行数がものすごく多いので割愛します。

OpenPyXLを使ってExcelファイルにデータを書き出す

次に、Excelにデータを書き出します。

import openpyxl

read_file = 'aedh3103.xlsx'
read_book = openpyxl.load_workbook( read_file )
read_sheet = read_book.worksheets[0]

write_file = 'copy.xlsx'
write_book = openpyxl.Workbook()
write_sheet = write_book.active
write_sheet.title = '埼玉県のAED設置場所情報'

for i, row in enumerate( read_sheet.rows, start=1 ):
    for j, col in enumerate( row, start=1 ):
        write_sheet.cell( i, j, col.value )

write_book.save( write_file )

write_ が付いている行が書き出しに関係したプログラムです。

結局やっていることは、単なるExcelファイルのコピーでしかありませんけどね・・・

OpenPyXLの利点はセルの書式を変えるなどの操作もできますが、欠点として旧形式の .xls ファイルは読めないことでしょうか。

Pandasを使ってExcelファイルのデータを読み込む

次にPandasを使って、Excelファイルを読み込んでみます。xlrd というライブラリも必要になります。

pip install xlrd

それでは、プログラムです。

import pandas

file = 'aedh3103.xlsx'
book = pandas.read_excel( file )

print( book )
print( book.iloc[ 7, 2 ], book.iloc[ 7, 4 ] )

6・7行目は、データを表示しているだけなので、実質3行だけです。

実行結果です。

      団体コード  団体名  ... AED画像_ライセンス  AED画像_画像テキスト
0    110001  埼玉県  ...         NaN           NaN
1    110001  埼玉県  ...         NaN           NaN
2    110001  埼玉県  ...         NaN           NaN
3    110001  埼玉県  ...         NaN           NaN
4    110001  埼玉県  ...         NaN           NaN
5    110001  埼玉県  ...         NaN           NaN
6    110001  埼玉県  ...         NaN           NaN
7    110001  埼玉県  ...         NaN           NaN
8    110001  埼玉県  ...         NaN           NaN
9    110001  埼玉県  ...         NaN           NaN
10   110001  埼玉県  ...         NaN           NaN
11   110001  埼玉県  ...         NaN           NaN
12   110001  埼玉県  ...         NaN           NaN
13   110001  埼玉県  ...         NaN           NaN
14   110001  埼玉県  ...         NaN           NaN
15   110001  埼玉県  ...         NaN           NaN
16   110001  埼玉県  ...         NaN           NaN
17   110001  埼玉県  ...         NaN           NaN
18   110001  埼玉県  ...         NaN           NaN
19   110001  埼玉県  ...         NaN           NaN
20   110001  埼玉県  ...         NaN           NaN
21   110001  埼玉県  ...         NaN           NaN
22   110001  埼玉県  ...         NaN           NaN
23   110001  埼玉県  ...         NaN           NaN
24   110001  埼玉県  ...         NaN           NaN
25   110001  埼玉県  ...         NaN           NaN
26   110001  埼玉県  ...         NaN           NaN
27   110001  埼玉県  ...         NaN           NaN
28   110001  埼玉県  ...         NaN           NaN
29   110001  埼玉県  ...         NaN           NaN
..      ...  ...  ...         ...           ...
546  110001  埼玉県  ...         NaN           NaN
547  110001  埼玉県  ...         NaN           NaN
548  110001  埼玉県  ...         NaN           NaN
549  110001  埼玉県  ...         NaN           NaN
550  110001  埼玉県  ...         NaN           NaN
551  110001  埼玉県  ...         NaN           NaN
552  110001  埼玉県  ...         NaN           NaN
553  110001  埼玉県  ...         NaN           NaN
554  110001  埼玉県  ...         NaN           NaN
555  110001  埼玉県  ...         NaN           NaN
556  110001  埼玉県  ...         NaN           NaN
557  110001  埼玉県  ...         NaN           NaN
558  110001  埼玉県  ...         NaN           NaN
559  110001  埼玉県  ...         NaN           NaN
560  110001  埼玉県  ...         NaN           NaN
561  110001  埼玉県  ...         NaN           NaN
562  110001  埼玉県  ...         NaN           NaN
563  110001  埼玉県  ...         NaN           NaN
564  110001  埼玉県  ...         NaN           NaN
565  110001  埼玉県  ...         NaN           NaN
566  110001  埼玉県  ...         NaN           NaN
567  110001  埼玉県  ...         NaN           NaN
568  110001  埼玉県  ...         NaN           NaN
569  110001  埼玉県  ...         NaN           NaN
570  110001  埼玉県  ...         NaN           NaN
571  110001  埼玉県  ...         NaN           NaN
572  110001  埼玉県  ...         NaN           NaN
573  110001  埼玉県  ...         NaN           NaN
574  110001  埼玉県  ...         NaN           NaN
575  110001  埼玉県  ...         NaN           NaN

[576 rows x 19 columns]
埼玉県立文書館 埼玉県さいたま市浦和区高砂4-3-18

Pandasを使ってExcelファイルにデータを書き出す

最後に、Pandasを使ってExcelにデータを書き出します。

import pandas

file = 'aedh3103.xlsx'
book = pandas.read_excel( file )

df = book.loc[ :, [ '設置場所_名称', '設置場所_住所', '設置場所_詳細', '設置場所_緯度', '設置場所_経度' ] ]
df.to_excel( 'AED設置場所_加工済み.xlsx', sheet_name='AED設置場所' )

6行目は単に列を絞り込んでいるだけなので、書き出している箇所は7行目だけになります。

今回はここまででおしまいにします。それではまた。

Posted by 春日井 優