Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
pythonで
オフィス快適化計画
PyCon APAC 2013
kzfm
自己紹介
•  kzfm (@fmkz___)
–  blog.kzfmix.com
–  Shizuoka.py
•  とある製薬企業の研究員
•  日本酒とdrum n bass好き
•  Python歴は6年くらい
–  (その前はPerl)
•  よく使うのはFlask, Pandas
内容
•  Excelでの書類入力にイライラしない☆
•  社会人としてWordとどう付き合うか?
•  ルーチンワークなスライド作成からの開放
•  xlsx,docx,pptxとは何なのだろう?
どうして社会人はExcelで書
類をつくるのか?
特に総務系のヒトの
Excel好きは異常
表計算完全無視☆Excel
h"p://toge"er.com/li/101450
論破してもムダ(-_-;)
総務のヒトと仲良くするための
Python☆
表計算がしたければ
R(Rpy2)かPandasで
一年に一度くらいのExcel申請
書は耐えられるが、
毎週とか毎日は辛い
例えば
pubmed
•  医学・生物学分野の学術文献検索サービ
ス
•  医学・生物学論文検索界のグーグル
– ないと死ぬ
pythonでオフィス快適化計画
欲しい文献がない場合
•  図書の係のヒトに大学図書館に出向いて
もらって複写をしてもらっていた
– ちょっと前まではpdfなんて少なかった
– Excel申請書類にコピペしてお願いする
pythonでオフィス快適化計画
pythonでオフィス快適化計画
pythonでオフィス快適化計画
pythonでオフィス快適化計画
pythonでオフィス快適化計画
pythonでオフィス快適化計画
めんどくさすぎる!
複写して欲しい論文が何十報
もあるとげんなりする
優秀な人程困る…
そこでPython☆
OpenPyXL+BioPython
•  OpenPyXL
– Excel 2007 xlsx/xlsmを読み書きする
パッケージ
•  BioPython
– PythonでBioinformatics(ゲノム配列や
タンパク質立体構造を扱う)
– PubmedのAPI(xmlが返ってくる)にも対
応
それっぽいxlsx
コード
from	
  Bio	
  import	
  Entrez,	
  Medline	
  
from	
  openpyxl	
  import	
  load_workbook	
  
Entrez.email	
  =	
  ”_____@gmail.com"	
  
handle	
  =	
  Entrez.efetch(db="pubmed",	
  id=["21982300"],	
  re"ype="medline",	
  retmode="text")	
  
records	
  =	
  Medline.parse(handle)	
  
record	
  =	
  list(records)[0]	
  
wb	
  =	
  load_workbook('ref_cp.xlsx')	
  
ws	
  =	
  wb.get_acSve_sheet()	
  
ws.cell('B1').value	
  =	
  record.get("JT",	
  "")	
  
ws.cell('B2').value	
  =	
  record.get("VI",	
  "")	
  
ws.cell('B3').value	
  =	
  record.get("PG",	
  "")	
  
ws.cell('B4').value	
  =	
  record.get("IS",	
  "")	
  
ws.cell('B5').value	
  =	
  record.get("DP",	
  "")	
  
ws.cell('B6').value	
  =	
  "	
  ".join(record.get("FAU")[:3])	
  
ws.cell('B7').value	
  =	
  record.get("TI",	
  "")	
  
wb.save('openbabel.xlsx')	
  
結果
あとはウェブサービスにしてブックマークレット用意しておけばOK
ここまでのまとめ
•  PyOpenXLを使うことで、既存の
Excelファイルをテンプレートとした入
力作業を自動化できる
•  時間の節約
•  無駄な作業からの開放
他にPythonでExcelを扱う
モジュール
XlsxWriter
•  https://github.com/jmcnamara/
XlsxWriter
•  PerlのExcel::Writer::XLSXのポート
•  xlsxファイルの書き込みのみサポート
•  既存のファイルを読み込んで修正して出力
みたいなことはできない
xlrd/xlwt
•  xlrd
– Excelファイルを読む(read)
•  xlwt
– Excelファイルに書き出す(write)
•  読み書きできるので既存のExcelファイ
ルをテンプレートとして編集した後別の
ファイルに出力できる
•  古いフォーマットにも対応
社会人としてWordと
どう付き合うか?
wordで文書作成
•  報告書のようなもの
–  誰に報告したいのか?
–  報告書は再利用されるのか?
–  そもそも読まれるのか?
•  申請書類のようなもの
–  テンプレートに記入
•  原稿っぽいもの
–  章立て
–  校正、修正
wordで文書作成
•  報告書のようなもの
–  誰に報告したいのか?
–  報告書は再利用されるのか?
–  そもそも読まれるのか?
•  申請書類のようなもの
–  テンプレートに記入
•  原稿っぽいもの
–  章立て
–  校正、修正
実験レポート
•  いつ誰がどういう実験をしてどういう結果を
出したかというレポート
•  トレーサビリティ重要
–  word(doc)フォーマットでファイルを作って深
い(不快)フォルダに入れるルール
•  /部門/研究室/年度/月度/実験者/区分/id.doc
•  これは使いづらかった
–  アクセスしにくい
–  全体の把握をしにくい
–  同僚が何やっているのか全然分からん
もっと楽をしたい
•  簡単に編集したい
•  レポートを簡単に検索したい
•  webブラウザでも見たい
•  で、Wikiを使うことにした
FSWiki
•  perlで書かれ
たwikiエンジ
ン
•  タグで分類
•  XML-RPCに
対応
•  pdfで出力で
きる
FSWiki
•  報告書をpdfで
出そうとしたら
wordで出せと
•  RTF::Writer
というモジュー
ルを使ってdoc
に出力するプラ
グイン作った
docのテンプレートに埋め込む
学んだこと
•  WIKIでレポートまとめていくので編集が
容易、仕事とレポートを並行して行う
TDDっぽい仕事感が得られる(リズムが
気持ちいい)
•  レポート作成の心理的障が下がった
•  軽いバージョン管理
•  必要十分な検索機能
コンテンツと見た目の分離重要
•  コンテンツはできるだけシンプルな記法
(markdown,ReST)で持っておく
– バージョン管理システムと相性がいい
– フォーマットの変換が簡単にできるように
•  epubとかmobiとか重要度上がってるし
•  docにするとコンテンツの再利用性が下
がる(doc->docならいいけど)
– word立ち上げる時間もバカにならない
– ファイルの管理コストも(SharePoint?)
doc(x)でコンテンツを管理しな
いというスタイルに転向した
Sphinxとかよく使う
Sphinx
•  「美しいドキュメントを簡単に生成する
ことができるドキュメンテーションツー
ル」ですね!
•  pdfとかepubに出力できて便利ですが
もちろんdocxに出力する拡張もあります
sphinx-docxbuilder
•  https://bitbucket.org/haraisao/
sphinx-docxbuilder
便利( ・ิω・ิ)
Sphinxの詳細は今日の午後のセッ
ションのスライドとかSphinx-
Users.jpのサイトをご覧下さい
Sphinxをはじめよう
h"p://www.oreilly.co.jp/books/9784873116488/
python-docx
•  word2007形式のファイルの読み書き
ができる
•  xmlを直接操作するような感じ
•  個人的にはもうちょっと高レベルなAPI
のほうが嬉しいかも
コード
from	
  docx	
  import	
  *	
  
relaSonships	
  =	
  relaSonshiplist()	
  
document	
  =	
  newdocument()	
  
body	
  =	
  document.xpath('/w:document/w:body',	
  namespaces=nsprefixes)[0]	
  
body.append(heading(u"日本酒",	
  1))	
  
sake_list	
  =	
  [{"name":u"開運",	
  "image":"kaiun.jpg",	
  "desc":u"(静岡)美味い"},	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {"name":u"庭のうぐいす",	
  "image":"uguisu.jpg",	
  "desc":u"(福岡)スパークリング"},	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {"name":u"空木",	
  "image":"utugi.jpg",	
  "desc":u"(宮城)カップの絵柄が素敵"}]	
  
コード(続き)
for	
  sake	
  in	
  sake_list:	
  
	
  	
  	
  	
  body.append(heading(sake["name"],	
  2))	
  
	
  	
  	
  	
  body.append(paragraph(sake["desc"]))	
  
	
  	
  	
  	
  relaSonships,	
  picpara	
  =	
  picture(relaSonships,	
  sake["image"],	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sake["name"],	
  pixelwidth=100,	
  pixelheight=100)	
  
	
  	
  	
  	
  body.append(picpara)	
  
coreprops	
  =	
  coreproperSes(Stle="sake",	
  subject="",	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  creator="kzfm",	
  keywords=[])	
  
appprops	
  =	
  appproperSes()	
  
conten"ypes	
  =	
  conten"ypes()	
  
websegngs	
  =	
  websegngs()	
  
wordrelaSonships	
  =	
  wordrelaSonships(relaSonships)	
  
savedocx(document,	
  coreprops,	
  appprops,	
  conten"ypes,	
  websegngs,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  wordrelaSonships,	
  'sake.docx’)	
  
できること
•  段落
•  リスト
•  数字付きリスト
•  見出し
•  表
•  ページ分割
•  画像挿入
wordで文書作成
•  報告書のようなもの
–  誰に報告したいのか?
–  報告書は再利用されるのか?
–  そもそも読まれるのか?
•  申請書類のようなもの
–  テンプレートに記入
•  原稿っぽいもの
–  章立て
–  校正、修正
ルーチンワークなスライド作
成からの開放
例
•  Naverまとめから
画像を取り出して
pptxにする
–  【
新宿】ガチで美味い
ラーメン屋だけまとめ
た
python-pptx + requests
prs = Presentation()
bullet_slidelayout = prs.slidelayouts[1]
c = requests.get('http://matome.naver.jp/odai/2136205629354777701').content
urls = [x.group(1) for x in re.finditer(r'<img src="(.+)".*?class="MTMItemThumb".*?/>', c)]
for i, url in enumerate(urls, 1):
img_path = "{}.jpg".format(i)
r = requests.get(url)
if r.status_code == 200:
with open(img_path, 'w') as f:
f.write(r.content)
shapes = prs.slides.add_slide(bullet_slidelayout).shapes
shapes.placeholders[0].text = '新宿のガチで美味いラーメン ({})'.format(i)
pic = shapes.add_picture(img_path, Inches(2.1), Inches(2), Px(280 * 1.427), Px(280))
prs.save('ramen.pptx')
ガチで美味いスライド
創薬研究は様々なデータを収集
•  異なる技能をもった複数人のチームでゴールを目
指す
–  化合物合成するヒト(ケミスト)
–  効き目を実験するヒト
•  タンパク質
•  細胞
•  動物
–  体内での薬の動きをみるヒト、毒性みるヒト
•  細胞
•  動物
–  予測モデル作ったりシミュレーションしたりするヒト
•  コンピュテーショナルケミスト
–  データサイエンティスト
•  バイオインフォマティクス
•  ケモインフォマティクス
それぞれ違う人間が関わっている
XX0035	
   XX0036	
 XX0049	
 XX0088	
  
合成者	
 chemistA	
 chemitA	
 chemistB	
 chemistC	
Structure	
 
Molecular	
  weight	
  440	
 378	
 477	
 529	
AcSvity	
  10.0	
 0.99	
 0.24	
 5.5	
Stability	
   10	
 20	
 0	
 5	
logD	
  3.1	
 2.8	
 2.3	
 2.6	
Solubility	
  17	
 <1	
 36	
 42	
PAMPA	
  15	
 23	
 22	
 33	
hERG	
 5	
 3.3	
 -­‐	
 -­‐	
dGSH	
 N.D.	
 N.D.	
 -­‐	
 -­‐	
PPB	
 99.3	
 95	
 -­‐	
 -­‐	
PK	
 136	
 48	
 122	
 147	
PK	
  t1/2	
 17	
 3.7	
 5.2	
 5.2
コピペの問題
•  時間がかかる
– まとめるだけでも労力が要る
– それぞれの研究者からレポートを集めてせっ
せとコピペ作業は忙しい時には発狂する
•  ミスる
– 数字を間違えたり、入れるべきカラムを間違
えたり
– それを避けるための無駄なダブルチェック
pythonで解消
•  Python-pptx+SQLAlchemyで必要
なデータを取ってきて、表にまとめるのを
自動化できる
•  コピペからの開放☆
•  資料作成時間というムダの削減
パッケージまとめ
xlsx	
• XlsxWriter	
• xlrd/xlwt	
• OpenPyXL	
docx	
• python-­‐
docx	
pptx	
• python-­‐
pptx	
これでほとんど困らない
そもそも
xlsx pptx docx
とはなにか?
Office Open XML
•  Office Open XML (OpenXML、
OOXML) とは、XMLをベースとしたオ
フィススイート用のファイルフォーマット
である。
– http://ja.wikipedia.org/wiki/
Office_Open_XML
– ECMA標準(ECMA-376)
xmlを含むもろもろをzip圧
縮して拡張子を変えたもの
詳しく知りたいヒトは
•  仕様
– http://www.ecma-
international.org/publications/
standards/Ecma-376.htm
•  書籍
– 入門 OfficeOpen XML
例(prs1.pptx)
unzip prs1.pptx ; tree
.	
  
├──	
  [Content_Types].xml	
  
├──	
  _rels	
  
├──	
  docProps	
  
│	
  	
  	
  ├──	
  app.xml	
  
│	
  	
  	
  ├──	
  core.xml	
  
│	
  	
  	
  └──	
  thumbnail.jpeg	
  
└──	
  ppt	
  
	
  	
  	
  	
  ├──	
  _rels	
  
	
  	
  	
  	
  │	
  	
  	
  └──	
  presentaSon.xml.rels	
  
	
  	
  	
  	
  ├──	
  presProps.xml	
  
	
  	
  	
  	
  ├──	
  presentaSon.xml	
  
	
  	
  	
  	
  ├──	
  printerSegngs	
  
	
  	
  	
  	
  │	
  	
  	
  └──	
  printerSegngs1.bin	
  
	
  	
  	
  	
  ├──	
  slideLayouts	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  _rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout1.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout10.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout11.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout2.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout3.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout4.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout5.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout6.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout7.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout8.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  └──	
  slideLayout9.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout1.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout10.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout11.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout2.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout3.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout4.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout5.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout6.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout7.xml	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  slideLayout8.xml	
  
	
  	
  	
  	
  │	
  	
  	
  └──	
  slideLayout9.xml	
  
	
  	
  	
  	
  ├──	
  slideMasters	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  _rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  └──	
  slideMaster1.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  └──	
  slideMaster1.xml	
  
	
  	
  	
  	
  ├──	
  slides	
  
	
  	
  	
  	
  │	
  	
  	
  ├──	
  _rels	
  
	
  	
  	
  	
  │	
  	
  	
  │	
  	
  	
  └──	
  slide1.xml.rels	
  
	
  	
  	
  	
  │	
  	
  	
  └──	
  slide1.xml	
  
	
  	
  	
  	
  ├──	
  tableStyles.xml	
  
	
  	
  	
  	
  ├──	
  theme	
  
	
  	
  	
  	
  │	
  	
  	
  └──	
  theme1.xml	
  
	
  	
  	
  	
  └──	
  viewProps.xml	
  
書き換えればよろしい
$	
  zip	
  -­‐r	
  prs2.pptx	
  [Content_Types].xml	
  _rels	
  docProps	
  ppt
簡単☆
pythonでやってみる
{{title}}	
{{name}}
Torii	
  of	
  Miyajima	
  /	
  nobusue
コード
from	
  jinja2	
  import	
  Template	
  
from	
  zipfile	
  import	
  ZipFile	
  
f	
  =	
  ZipFile("template.pptx")	
  
w	
  =	
  ZipFile("sample.pptx",	
  "w")	
  
for	
  name	
  in	
  f.namelist():	
  
	
  	
  	
  	
  s	
  =	
  f.read(name)	
  
	
  	
  	
  	
  if	
  name	
  ==	
  "ppt/slides/slide1.xml":	
  
	
  	
  	
  	
  	
  	
  	
  	
  template	
  =	
  Template(s.decode("ux-­‐8"))	
  
	
  	
  	
  	
  	
  	
  	
  	
  s	
  =	
  template.render(Stle=u"髭もいいけど神社でしょ(^_^)v",	
  name="@kzfm")	
  
	
  	
  	
  	
  	
  	
  	
  	
  s	
  =	
  s.encode("ux-­‐8")	
  
	
  	
  	
  	
  w.writestr(name,	
  s)	
  
f.close()	
  
w.close()	
  
髭もいいけど神社でしょ(^_^)v	
@kzfm
Torii	
  of	
  Miyajima	
  /	
  nobusue
zipfile(とlxml)モジュール
があればOK
Office文書をPythonで
生成することのメリット
•  何度もくり返すような作業を毎回手でやる
必要がなくなる
•  ドキュメント構築のプロセスを再利用で
きる
•  Gitのようなバージョン管理システムで管
理できる
MS Officeだけでなく
Pythonを使うことで
あなたのオフィスも
快適になるかも☆
ご清聴ありがとうございました

More Related Content

pythonでオフィス快適化計画