今回はこれまでにゲットした情報をExcelに保存したいと思います。
これまでの記事はこちら
● Pythonで論文情報をまとめてゲットする①~ PubMed APIについて~
● Pythonで論文情報をまとめてゲットする②~ 下準備 ~
● Pythonで論文情報をまとめてゲットする③~ ESearchを使ってPMIDを取得 ~
● Pythonで論文情報をまとめてゲットする④~ ESummaryを使って論文タイトルを取得 ~
前回の記事でSummariesというオブジェクトを作成し、
そこに論文情報(PMID, Title, Author, Journal, Pubdate)を格納しました。
Summariesにはリストの中にそれぞれの論文の情報を辞書形式で入れてます。
扱いやすくかつ見やすくする目的でExcelの表形式の様な見た目のデータフレームを扱えるライブラリPandasに入れていきます。
PandasはPythonでのデータ分析には必須のライブラリです。
また、実際に書き出して保存する時にはExcelが便利かと思いますので、
PandasでのデータフレームをExcelファイルとして保存する為に必須のライブラリであるOpenpyxlも使っていきます。
ライブラリのimport
まずは必要なライブラリをimportします。
import pandas as pd import openpyxl
エラーなくインポートされたらOKです。
Pandas データフレームの作成
ここからエクセルの表のようにデータを格納します。
最終的にはこうなるイメージです。
空のデータフレームを作成
data = pd.DataFrame(columns = ['PMID','Title', 'Author', 'Journal', 'Pubdate']) # カラム名を指定してデータフレームを作成
カラム名を指定した空のデータフレームを作成しました。下画像参照
カラム名のみ入った空のデータフレームが作成されましたね。
データフレームへの格納
まず、Summariesよりカラム毎(PMIDやTitleなど)のリストを作成します。
PMIDs = [ i['pmid'] for i in Summaries ] Titles = [ i['title'] for i in Summaries ] Authors = [ i['Author'] for i in Summaries ] Journals = [ i['Journal'] for i in Summaries ] Pubdates = [ i['Pubdate'] for i in Summaries ]
作成したリストそれぞれをデータフレームに格納します。
data['PMID'] = PMIDs data['Title'] = Titles data['Author'] = Authors data['Journal'] = Journals data['Pubdate'] = Pubdates
Outputが以下のようになります。
OpenpyxlでExcel fileとして書き出す
必要なライブラリのインポート
import openpyxl from openpyxl.styles import Border, Font, Side, PatternFill, Alignment from openpyxl.utils.dataframe import dataframe_to_rows
1行目は重複となりますがopenpyxlのインポートをしています。
2行目はExcel上のスタイル(フォント、太字、塗り)などを設定するため。
3行目はPandasデータフレームをそのままopenpyxlに持っていくために使用します。
Bookの作成とシートの設定
wb = openpyxl.Workbook() #ワークブックの作成 ws = wb.active #ワークブックのアクティブになってるシートを選択 ws.title='論文' #シートの名前を変更
スタイルの設定値を決める
Excelとして書き出す際のフォントを設定していきます。 これは私個人の好みの設定ですので、各自いろいろ変えてみてください。
#フォントの設定 normal_font = Font(name = "Century Gothic",sz = 9,b = False) header_font = Font(name = "Century Gothic", sz = 9, b = True, color = 'FFFFFFFF') #ヘッダーの塗りの設定 header_fill = PatternFill(patternType = "solid", fgColor = "FF808080") #ヘッダーを中央揃えにする設定 header_center = Alignment(horizontal='center',vertical = 'center') #ヘッダーを太字にする設定 header_border = Border( outline=True, left=Side(style='thin', color='FF000000'), right=Side(style='thin', color='FF000000'), top=Side(style='thin', color='FF000000'), bottom=Side(style='thin', color='FF000000') )
pandasデータフレームをopenpyxlのシートへ書き込む
for r in dataframe_to_rows(data, index=False, header=True): ws.append(r)
これでpandasデータフレームがエクセルのシートに書き込まれました。
設定したスタイルを適用する
まずは、エクセルシートの全体のスタイルを設定します。
上で設定したnormal_fontを適応します。
フォントがCentury Gothicのサイズが9になるはずです。
for row in ws: for cell in row: cell.font = normal_font
次はheaderのスタイルを指定します。
headerはPMID、Title、Author、Journal、Pubmedの5つですので、
Cellは1行目の1列目から5列目がheaderとなります。
header_cell = ['A1', 'B1', 'C1', 'D1', 'E1'] for cell in header_cell: ws[cell].font = header_font ws[cell].fill = header_fill ws[cell].alignment = header_center ws[cell].border = header_border
エクセルファイルの保存
wb.save("test.xlsx")
エクセルを開くと以下のようになります。
セル幅は開いたあとに調整してます。
以上でpythonを使ってPubmedから論文情報を取得するシリーズの大きな部分は終了です。
これから更に発展して、abstractを引き抜いたりできますが、要望が多ければブログにしたいと思いますので、
コメントにお願いいたします。
また、tips等あったら記事にしたいと思います。
お疲れ様でした。