pythonでオフィス快適化計画

32,725 views
32,020 views

Published on

0 Comments
117 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
32,725
On SlideShare
0
From Embeds
0
Number of Embeds
1,585
Actions
Shares
0
Downloads
183
Comments
0
Likes
117
Embeds 0
No embeds

No notes for slide

pythonでオフィス快適化計画

  1. 1. pythonで オフィス快適化計画 PyCon APAC 2013 kzfm
  2. 2. 自己紹介 •  kzfm (@fmkz___) –  blog.kzfmix.com –  Shizuoka.py •  とある製薬企業の研究員 •  日本酒とdrum n bass好き •  Python歴は6年くらい –  (その前はPerl) •  よく使うのはFlask, Pandas
  3. 3. 内容 •  Excelでの書類入力にイライラしない☆ •  社会人としてWordとどう付き合うか? •  ルーチンワークなスライド作成からの開放 •  xlsx,docx,pptxとは何なのだろう?
  4. 4. どうして社会人はExcelで書 類をつくるのか? 特に総務系のヒトの Excel好きは異常
  5. 5. 表計算完全無視☆Excel
  6. 6. h"p://toge"er.com/li/101450
  7. 7. 論破してもムダ(-_-;)
  8. 8. 総務のヒトと仲良くするための Python☆ 表計算がしたければ R(Rpy2)かPandasで
  9. 9. 一年に一度くらいのExcel申請 書は耐えられるが、 毎週とか毎日は辛い
  10. 10. 例えば
  11. 11. pubmed •  医学・生物学分野の学術文献検索サービ ス •  医学・生物学論文検索界のグーグル – ないと死ぬ
  12. 12. 欲しい文献がない場合 •  図書の係のヒトに大学図書館に出向いて もらって複写をしてもらっていた – ちょっと前まではpdfなんて少なかった – Excel申請書類にコピペしてお願いする
  13. 13. めんどくさすぎる!
  14. 14. 複写して欲しい論文が何十報 もあるとげんなりする 優秀な人程困る…
  15. 15. そこでPython☆
  16. 16. OpenPyXL+BioPython •  OpenPyXL – Excel 2007 xlsx/xlsmを読み書きする パッケージ •  BioPython – PythonでBioinformatics(ゲノム配列や タンパク質立体構造を扱う) – PubmedのAPI(xmlが返ってくる)にも対 応
  17. 17. それっぽいxlsx
  18. 18. コード 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')  
  19. 19. 結果 あとはウェブサービスにしてブックマークレット用意しておけばOK
  20. 20. ここまでのまとめ •  PyOpenXLを使うことで、既存の Excelファイルをテンプレートとした入 力作業を自動化できる •  時間の節約 •  無駄な作業からの開放
  21. 21. 他にPythonでExcelを扱う モジュール
  22. 22. XlsxWriter •  https://github.com/jmcnamara/ XlsxWriter •  PerlのExcel::Writer::XLSXのポート •  xlsxファイルの書き込みのみサポート •  既存のファイルを読み込んで修正して出力 みたいなことはできない
  23. 23. xlrd/xlwt •  xlrd – Excelファイルを読む(read) •  xlwt – Excelファイルに書き出す(write) •  読み書きできるので既存のExcelファイ ルをテンプレートとして編集した後別の ファイルに出力できる •  古いフォーマットにも対応
  24. 24. 社会人としてWordと どう付き合うか?
  25. 25. wordで文書作成 •  報告書のようなもの –  誰に報告したいのか? –  報告書は再利用されるのか? –  そもそも読まれるのか? •  申請書類のようなもの –  テンプレートに記入 •  原稿っぽいもの –  章立て –  校正、修正
  26. 26. wordで文書作成 •  報告書のようなもの –  誰に報告したいのか? –  報告書は再利用されるのか? –  そもそも読まれるのか? •  申請書類のようなもの –  テンプレートに記入 •  原稿っぽいもの –  章立て –  校正、修正
  27. 27. 実験レポート •  いつ誰がどういう実験をしてどういう結果を 出したかというレポート •  トレーサビリティ重要 –  word(doc)フォーマットでファイルを作って深 い(不快)フォルダに入れるルール •  /部門/研究室/年度/月度/実験者/区分/id.doc •  これは使いづらかった –  アクセスしにくい –  全体の把握をしにくい –  同僚が何やっているのか全然分からん
  28. 28. もっと楽をしたい •  簡単に編集したい •  レポートを簡単に検索したい •  webブラウザでも見たい •  で、Wikiを使うことにした
  29. 29. FSWiki •  perlで書かれ たwikiエンジ ン •  タグで分類 •  XML-RPCに 対応 •  pdfで出力で きる
  30. 30. FSWiki •  報告書をpdfで 出そうとしたら wordで出せと •  RTF::Writer というモジュー ルを使ってdoc に出力するプラ グイン作った
  31. 31. docのテンプレートに埋め込む
  32. 32. 学んだこと •  WIKIでレポートまとめていくので編集が 容易、仕事とレポートを並行して行う TDDっぽい仕事感が得られる(リズムが 気持ちいい) •  レポート作成の心理的障が下がった •  軽いバージョン管理 •  必要十分な検索機能
  33. 33. コンテンツと見た目の分離重要 •  コンテンツはできるだけシンプルな記法 (markdown,ReST)で持っておく – バージョン管理システムと相性がいい – フォーマットの変換が簡単にできるように •  epubとかmobiとか重要度上がってるし •  docにするとコンテンツの再利用性が下 がる(doc->docならいいけど) – word立ち上げる時間もバカにならない – ファイルの管理コストも(SharePoint?)
  34. 34. doc(x)でコンテンツを管理しな いというスタイルに転向した Sphinxとかよく使う
  35. 35. Sphinx •  「美しいドキュメントを簡単に生成する ことができるドキュメンテーションツー ル」ですね! •  pdfとかepubに出力できて便利ですが もちろんdocxに出力する拡張もあります
  36. 36. sphinx-docxbuilder •  https://bitbucket.org/haraisao/ sphinx-docxbuilder
  37. 37. 便利( ・ิω・ิ) Sphinxの詳細は今日の午後のセッ ションのスライドとかSphinx- Users.jpのサイトをご覧下さい
  38. 38. Sphinxをはじめよう h"p://www.oreilly.co.jp/books/9784873116488/
  39. 39. python-docx •  word2007形式のファイルの読み書き ができる •  xmlを直接操作するような感じ •  個人的にはもうちょっと高レベルなAPI のほうが嬉しいかも
  40. 40. コード 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"(宮城)カップの絵柄が素敵"}]  
  41. 41. コード(続き) 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’)  
  42. 42. できること •  段落 •  リスト •  数字付きリスト •  見出し •  表 •  ページ分割 •  画像挿入
  43. 43. wordで文書作成 •  報告書のようなもの –  誰に報告したいのか? –  報告書は再利用されるのか? –  そもそも読まれるのか? •  申請書類のようなもの –  テンプレートに記入 •  原稿っぽいもの –  章立て –  校正、修正
  44. 44. ルーチンワークなスライド作 成からの開放
  45. 45. 例 •  Naverまとめから 画像を取り出して pptxにする –  【 新宿】ガチで美味い ラーメン屋だけまとめ た
  46. 46. 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')
  47. 47. ガチで美味いスライド
  48. 48. 創薬研究は様々なデータを収集 •  異なる技能をもった複数人のチームでゴールを目 指す –  化合物合成するヒト(ケミスト) –  効き目を実験するヒト •  タンパク質 •  細胞 •  動物 –  体内での薬の動きをみるヒト、毒性みるヒト •  細胞 •  動物 –  予測モデル作ったりシミュレーションしたりするヒト •  コンピュテーショナルケミスト –  データサイエンティスト •  バイオインフォマティクス •  ケモインフォマティクス
  49. 49. それぞれ違う人間が関わっている 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
  50. 50. コピペの問題 •  時間がかかる – まとめるだけでも労力が要る – それぞれの研究者からレポートを集めてせっ せとコピペ作業は忙しい時には発狂する •  ミスる – 数字を間違えたり、入れるべきカラムを間違 えたり – それを避けるための無駄なダブルチェック
  51. 51. pythonで解消 •  Python-pptx+SQLAlchemyで必要 なデータを取ってきて、表にまとめるのを 自動化できる •  コピペからの開放☆ •  資料作成時間というムダの削減
  52. 52. パッケージまとめ xlsx • XlsxWriter • xlrd/xlwt • OpenPyXL docx • python-­‐ docx pptx • python-­‐ pptx これでほとんど困らない
  53. 53. そもそも xlsx pptx docx とはなにか?
  54. 54. Office Open XML •  Office Open XML (OpenXML、 OOXML) とは、XMLをベースとしたオ フィススイート用のファイルフォーマット である。 – http://ja.wikipedia.org/wiki/ Office_Open_XML – ECMA標準(ECMA-376)
  55. 55. xmlを含むもろもろをzip圧 縮して拡張子を変えたもの
  56. 56. 詳しく知りたいヒトは •  仕様 – http://www.ecma- international.org/publications/ standards/Ecma-376.htm •  書籍 – 入門 OfficeOpen XML
  57. 57. 例(prs1.pptx)
  58. 58. 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  
  59. 59. 書き換えればよろしい $  zip  -­‐r  prs2.pptx  [Content_Types].xml  _rels  docProps  ppt
  60. 60. 簡単☆
  61. 61. pythonでやってみる
  62. 62. {{title}} {{name}} Torii  of  Miyajima  /  nobusue
  63. 63. コード 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()  
  64. 64. 髭もいいけど神社でしょ(^_^)v @kzfm Torii  of  Miyajima  /  nobusue
  65. 65. zipfile(とlxml)モジュール があればOK
  66. 66. Office文書をPythonで 生成することのメリット •  何度もくり返すような作業を毎回手でやる 必要がなくなる •  ドキュメント構築のプロセスを再利用で きる •  Gitのようなバージョン管理システムで管 理できる
  67. 67. MS Officeだけでなく Pythonを使うことで あなたのオフィスも 快適になるかも☆
  68. 68. ご清聴ありがとうございました

×