2018/01/19

Python Tips: split() を活用したい

Python での文字列操作に便利な split() の使い方についてご説明してみます。

'Hello, world'.split()

split()str 型と正規表現ライブラリにあるので、これらを順番に見ていきましょう。

str 型の split() メソッド


str 型の split() メソッドのドキュメントは次のようになっています。

print(''.split.__doc__)
# =>
# S.split(sep=None, maxsplit=-1) -> list of strings
# 
# Return a list of the words in S, using sep as the
# delimiter string.  If maxsplit is given, at most maxsplit
# splits are done. If sep is not specified or is None, any
# whitespace string is a separator and empty strings are
# removed from the result.

str.split() — Python 公式ドキュメント

日本語翻訳では次のように書かれています。

文字列を sep をデリミタ文字列として区切った単語のリストを返します。 maxsplit が与えられていれば、最大で maxsplit 回分割されます (つまり、リストは最大 maxsplit+1 要素になります)。 maxsplit が与えられないか -1 なら、分割の回数に制限はありません (可能なだけ分割されます)。

sep が与えられた場合、連続した区切り文字はまとめられず、空の文字列を区切っていると判断されます(例えば '1,,2'.split(',')['1', '', '2'] を返します)。引数 sep は複数の文字にもできます (例えば '1<>2<>3'.split('<>')['1', '2', '3'] を返します)。区切り文字を指定して空の文字列を分割すると、 [''] を返します。

str.split() — Python ドキュメント(日本語)

つまり、 split() はオプション引数(非必須な引数)を 2 つ受け取ることができる。その引数を使って、利用者は「区切り文字に何を使うのか」と「最大分割回数」を指定することができる、とのことです。戻り値の型は list です。

いくつかサンプルを見てみましょう。

引数なしで利用する

# 引数を指定しなければ、スペースで分割されます
'Guardians of the Galaxy'.split()
# => ['Guardians', 'of', 'the', 'Galaxy']

# スペースはどれだけ長くてもまとめられます
'Guardians   of   the        Galaxy'.split()
# => ['Guardians', 'of', 'the', 'Galaxy']

# 半角スペースの他にも、改行やタブもスペースとみなされます
'Guardians\tof   \t   the   \n   Galaxy'.split()
# => ['Guardians', 'of', 'the', 'Galaxy']

# その他 Unicode で「空白文字」とされているものもスペースとみなされるので
# 日本語で使われる全角空白( ideographic space / U+3000 )も区切り対象になります
'ガーディアンズ オブ ギャラクシー'.split()
# => ['ガーディアンズ', 'オブ', 'ギャラクシー']

引数を指定して利用する

# 第 1 引数に文字を渡せばそれが区切り文字となります
'文壇の、或老大家が亡くなって、その告別式の終り頃から、雨が降りはじめた。'.split('、')
# => ['文壇の', '或老大家が亡くなって', 'その告別式の終り頃から', '雨が降りはじめた。']

# 第 1 引数に文字列を渡した場合、その文字列がまるごと区切りとして使用されます
# 各文字が区切りになるわけではありません
'文壇の、或老大家が亡くなって、その告別式の終り頃から、雨が降りはじめた。'.split('、。')
# => ['文壇の、或老大家が亡くなって、その告別式の終り頃から、雨が降りはじめた。']

# 半角空白を渡した場合の挙動は、引数を渡さなかった場合と大幅に異なります

# 「区切り対象文字が半角空白だけで、なおかつ、半角空白が連続しない場合」にかぎり結果は同じになりますが・・・
'Guardians of the Galaxy'.split(' ')
# => ['Guardians', 'of', 'the', 'Galaxy']

# 連続する空白は 1 つずつ区切られてしまいます
'Guardians   of   the        Galaxy'.split(' ')
# => ['Guardians', '', '', 'of', '', '', 'the', '', '', '', '', '', '', '', 'Galaxy']

# また、タブや全角などの空白文字では区切られません
'ガーディアンズ オブ ギャラクシー'.split(' ')
# => ['ガーディアンズ\u3000オブ\u3000ギャラクシー']

# 第 2 引数は最大区切り回数です
'文壇の、或老大家が亡くなって、その告別式の終り頃から、雨が降りはじめた。'.split('、', 2)
# => ['文壇の', '或老大家が亡くなって', 'その告別式の終り頃から、雨が降りはじめた。']

# 第 2 引数を渡す必要があるけれど、区切り回数は指定したくない場合には `-1` を渡せば OK です
'文壇の、或老大家が亡くなって、その告別式の終り頃から、雨が降りはじめた。'.split('、', -1)
# => ['文壇の', '或老大家が亡くなって', 'その告別式の終り頃から', '雨が降りはじめた。']

以上です。

以下、よくあるニーズ別に使い方を見てみましょう。

複数の文字で区切りたい

str 型の split() メソッドは複数の区切り文字に対応していません。複数の文字で区切りたい場合は、 2 つのアプローチがあります。

  • split() 前に区切り文字を置換しておく
  • 正規表現ライブラリの split()を使う

split() 前に区切り文字を置換しておく:

('愛のままにわがままに僕は君だけを傷つけない'
  .replace('の', '\n')
  .replace('に', '\n')
  .replace('を', '\n')
  .split('\n'))
# => ['愛', 'まま', 'わがまま', '僕は君だけ', '傷つけない']

文字列に含まれないことが保証されている文字がもしあるなら、対象文字をすべてそれに置換した後に split() をかけることで、複数の文字で区切ることができます。

ただ、ほとんどの場面では次の「正規表現ライブラリの split() 」を使った方法を使うのがよいでしょう。

正規表現ライブラリの split()を使う:

正規表現の関数 split() を使えば複数の区切り文字での分割がシンプルにできます。

import re

re.split('[のにを]', '愛のままにわがままに僕は君だけを傷つけない')
# => ['愛', 'まま', 'わがまま', '僕は君だけ', '傷つけない']

あらゆる空白を区切り文字にしたいが、最大回数は指定したい

str 型の split() に第 1 引数を渡さなかったときの挙動を維持しつつ、最大分割回数は指定したい場合は、第 1 引数に None を指定して第 2 引数を指定します。

'Guardians   of   the        Galaxy'.split(None, 1)
# => ['Guardians', 'of   the        Galaxy']

あるいは、最大分割回数の引数を名前付きで渡しても OK です。

'Guardians   of   the        Galaxy'.split(maxsplit=1)
# => ['Guardians', 'of   the        Galaxy']

文字列を 1 文字ずつ分割したリストを取得したい

文字列を 1 文字ずつ分割したい場合に split() を使うことはできません。 split() を使うと、区切り文字が文字列から除外されてしまうためです。

その用途には、コンストラクタ list() などが使えます。

list('ガーディアンズ オブ ギャラクシー')
# =>
['ガ', 'ー', 'デ', 'ィ', 'ア', 'ン', 'ズ', '\u3000', 'オ', 'ブ', '\u3000', 'ギ', 'ャ', 'ラ', 'ク', 'シ', 'ー']

文字列を改行文字で分割したい

文字列を改行文字で分割したい場合は、多くの場合、 split() よりも、専用のメソッド splitlines() を使うとよいでしょう。

haiku = '''朝顔に
我は飯食う


男哉'''

haiku.splitlines()
# => ['朝顔に', '我は飯食う', '', '', '男哉']


split() だと、連続した改行(空行)がまとめられてしまいます。

haiku = '''朝顔に
我は飯食う


男哉'''

haiku.split()
# => ['朝顔に', '我は飯食う', '男哉']

このあたりはどちらの挙動が望ましいものなのかを先に把握して使い分けるとよいでしょう。

リスト全体を一気に生成せずにイテレータなどを介して各行を取得したい場合などは io.StringIO などを使ってもよいかもしれません。

import io
  
haiku = '''朝顔に
我は飯食う


男哉'''

for line in io.StringIO(haiku):
    print(repr(line))
# =>
# '朝顔に\n'
# '我は飯食う\n'
# '\n'
# '\n'
# '男哉'

str 型の split() メソッドについては以上です。続いて正規表現ライブラリの split() について見ていきましょう。


正規表現ライブラリの split()


正規表現ライブラリにも str 型と似た split() があります。

厳密にいうと、「 split() 関数」と「正規表現オブジェクトの split() メソッド」の 2 つがあります。

import re

# split() 関数
re.split('[のにを]', '愛のままにわがままに僕は君だけを傷つけない')
# => ['愛', 'まま', 'わがまま', '僕は君だけ', '傷つけない']

# 正規表現オブジェクトの split() メソッド
pattern = re.compile('[のにを]')
pattern.split('愛のままにわがままに僕は君だけを傷つけない')
# => ['愛', 'まま', 'わがまま', '僕は君だけ', '傷つけない']

ここでは、 split() 関数の方を使って使い方を見てみましょう。

まず、宣言文は次のようになっています。

def split(pattern, string, maxsplit=0, flags=0):

各引数について説明します。

  • pattern: 区切りに使いたい文字の正規表現パターン。
  • string: 分割対象の文字列。
  • maxsplit: 最大分割回数。 str 型の同名の引数と同じイメージ。
  • flags: 正規表現フラグ。

正規表現フラグには次のものが利用可能です。

  • re.ASCII (re.A)
  • re.DEBUG
  • re.IGNORECASE (re.I)
  • re.LOCALE (re.L)
  • re.MULTILINE (re.M)
  • re.DOTALL (re.S)
  • re.VERBOSE (re.X)

このフラグは Python 3.6 以降では Enum 型の enum.IntFlag のサブクラスである re.RegexFlag のインスタンスとなっているようです。

このフラグは正規表現のオプションを指定するためのものです。正規表現に馴染みのある方はどういうものを意味するのかピンと来るのではないかと思います。詳しく知りたい方は公式のドキュメントにあたってみてください。

re — Python 公式ドキュメント

正規表現ライブラリの split() 関数の docstring は次のようになっています。

import re

print(re.split.__doc__)
# =>
# Split the source string by the occurrences of the pattern,
#     returning a list containing the resulting substrings.  If
#     capturing parentheses are used in pattern, then the text of all
#     groups in the pattern are also returned as part of the resulting
#     list.  If maxsplit is nonzero, at most maxsplit splits occur,
#     and the remainder of the string is returned as the final element
#     of the list.

re.split() — Python 公式ドキュメント

この関数は、文字列を正規表現パターンで分割したリストを返す。正規表現の中でかっこ( () )が使われた場合、それは戻り値のリストに含まれる、とのことです。

サンプルを見てみましょう。

import re

# 指定された正規表現で分割する
re.split('[のにを]', '愛のままにわがままに僕は君だけを傷つけない')
# => ['愛', 'まま', 'わがまま', '僕は君だけ', '傷つけない']

# 改行文字で分割する
haiku = '''朝顔に
我は飯食う


男哉'''

re.split('\n', haiku)
# => ['朝顔に', '我は飯食う', '', '', '男哉']

re.split('\n+', haiku)
# => ['朝顔に', '我は飯食う', '男哉']

# () を使って、区切り文字そのものを戻り値のリストに含める
re.split('(\s+)', 'ガーディアンズ  オブ  ギャラクシー')
# => ['ガーディアンズ', '\u3000\u3000', 'オブ', '\u3000\u3000', 'ギャラクシー']

正規表現オブジェクトの split() メソッドの方は引数が少し異なりますが、使い方はこの split() 関数とほぼ同じです。

宣言部は次のようになっているようです。

regex.split(string, maxsplit=0)

正規表現ライブラリの split() については以上です。

...

ここまで来ると押さえておきたいのが「 str 型の split() と正規表現ライブラリの split() はどのように使い分ければよいのか」という点についてですが、こちらは、次のケースでのみ str 型の split() を使って、その他のケースでは正規表現ライブラリの split() を使う、というのがよいのではないかと思います。

  • Unicode のすべての空白文字で区切りたい。空白が連続する場合はひとつにまとめたい。 → str 型の split() を区切り文字指定なしで利用する。
  • 区切り文字が 1 つだけ。区切り文字が連続する場合は、まとめずに空文字で分割してほしい。 → str 型の split() を区切り文字を指定して利用する。

レアケースな気もしますが、実行時パフォーマンス向上を追求しないといけない場合は、無理やりにでも str 型の split() を使った方がいいケースもあるかもしれません。


以上、文字列操作に便利な Python の split() についてでした。

2017/12/31

2017 年 GitHub でスターの多かった Python リポジトリ

2017 年もいよいよ終わり、間もなく 2018 年ですね。

今年 1 年の振り返りのために、 2017 年にリリースされた人気の GitHub リポジトリについてまとめてみました。具体的には、「 GitHub に認識されているリポジトリの言語が Python で」「スター数が 2500 以上のもの」をリストアップしてみました。

結果、引っかかったリポジトリの数は合計 32 個です。個人的には、マシンラーニング(機械学習)関連のリポジトリが非常に多いのが印象的でした。みなさんはこのリストからどのような印象を抱かれるでしょうか。

以下私なりにかんたんな説明と description 翻訳を付けているので、興味のある方はご覧になってみてください。

1. system-design-primer


大規模システムの設計方法について紹介したドキュメントです。

リポジトリ名system-design-primer
説明Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
説明(翻訳)大規模システムの設計方法を学びましょう。システム設計面接の準備をしましょう。暗記用のフラッシュカード付きです。
URLhttps://github.com/donnemartin/system-design-primer
ホームページ
スター21763


2. cpython


CPython そのもののリポジトリです。 2017 年に GitHub に移設したようです。

リポジトリ名cpython
説明The Python programming language
説明(翻訳)Python プログラミング言語
URLhttps://github.com/python/cpython
ホームページhttps://www.python.org/
スター15030


3. face_recognition


画像内の人の顔を認識するためのライブラリです。

リアルタイムの顔認識もサポートしているようです。

リポジトリ名face_recognition
説明The world's simplest facial recognition api for Python and the command line
説明(翻訳)Python とコマンドラインで使う、世界で最もシンプルな顔認識 API
URLhttps://github.com/ageitgey/face_recognition
ホームページ
スター8444


4. pix2code


UI 画像からそれを生成するコードを自動生成するライブラリです。

README からリンクされているデモ動画がわかりやすいです。

pix2code - YouTube

現時点では出力フォーマットとして、 iOS アプリ、 Android アプリ、 HTML の 3 つがサポートされているようです。

まだ実用レベルにはなっていなさそうなので、このような技術が数年以内にコーダーの仕事をガラリと変える可能性は低そうですが、今の技術の進歩のスピードを見ると 10 年以内ぐらいには影響がありそうな気もします。

リポジトリ名pix2code
説明pix2code: Generating Code from a Graphical User Interface Screenshot
説明(翻訳)pix2code: グラフィカルユーザーインタフェーススクリーンショットからのコード生成
URLhttps://github.com/tonybeltramelli/pix2code
ホームページ
スター8024


5. python-fire


Python のユーティリティクラスをコマンドラインからすぐに呼び出せるようにできるライブラリです。

メソッド名と引数をコマンドラインで渡せばそのままクラスのメソッドが実行できる形のようです。

「 Google の公式なプロダクトではありません」と但し書きがついていますが、リポジトリは Google グループに所属しています。

リポジトリ名python-fire
説明Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.
説明(翻訳)Python Fire はありとあらゆる Python オブジェクトに対してコマンドラインインタフェース( CLI )を自動生成するライブラリです。
URLhttps://github.com/google/python-fire
ホームページ
スター7655


6. ML-From-Scratch


説明のとおり、マシンラーニングのモデルとアルゴリズムを Python で実装したコード集です。

リポジトリ名ML-From-Scratch
説明Python implementations of Machine Learning models and algorithms from scratch. Aims to cover everything from Data Mining techniques to Deep Learning.
説明(翻訳)マシンラーニングのモデルとアルゴリズムの、ゼロベースでの Python 実装。データマイニング技術からディープラーニングまでのあらゆることをカバーすることを目指しています。
URLhttps://github.com/eriklindernoren/ML-From-Scratch
ホームページ
スター7598


7. pipenv


bundler や composer 、 npm といった他の言語のパッケージマネージャーと同等の機能を提供するツールです。

Python の virtualenv と pip を組み合わせて、プロジェクト固有の環境をシンプルに構築・管理できる機能を提供しています。

リポジトリ名pipenv
説明Python Development Workflow for Humans.
説明(翻訳)人間のための Python 開発ワークフロー。
URLhttps://github.com/pypa/pipenv
ホームページhttps://docs.pipenv.org/
スター6936


8. sonnet


複雑なニューラルネットワークを構築するための、 TensorFlow ベースのライブラリです。

Google が 2014 年に買収した DeepMind 社が提供しているようです。

リポジトリ名sonnet
説明TensorFlow-based neural network library
説明(翻訳)TensorFlow ベースのニューラルネットワークライブラリ
URLhttps://github.com/deepmind/sonnet
ホームページ
スター5698


9. gixy


Nginx の設定ファイルを静的に解析するためのツールです。

設定ミスなどを自動的に検出することを目的に作られているようです。

リポジトリ名gixy
説明Nginx configuration static analyzer
説明(翻訳)Nginx コンフィギュレーションのスタティックアナライザー
URLhttps://github.com/yandex/gixy
ホームページ
スター5001


10. trump2cash


アメリカのドナルド・トランプ大統領のツイートを見て、株取引を行うためのライブラリだそうです(笑)。

リポジトリ名trump2cash
説明A stock trading bot powered by Trump tweets
説明(翻訳)Trump のツイートで動く株取引のボット
URLhttps://github.com/maxbbraun/trump2cash
ホームページhttp://trump2cash.biz
スター4111


11. pytorch-tutorial


ディープラーニング用のライブラリ PyTorch のチュートリアルです。

リポジトリ名pytorch-tutorial
説明PyTorch Tutorial for Deep Learning Researchers
説明(翻訳)ディープラーニングの研究者のための PyTorch チュートリアル
URLhttps://github.com/yunjey/pytorch-tutorial
ホームページ
スター4079


12. wtfpython


一見直感的でないふるまいをする、トリッキーな Python スニペットのコレクションです。

リポジトリ名wtfpython
説明A collection of interesting, subtle, and tricky Python snippets.
説明(翻訳)Python の、おもしろかったりトリッキーだったりするスニペットのコレクション
URLhttps://github.com/satwikkansal/wtfpython
ホームページhttps://bit.ly/wtfpython
スター4046


13. inter


UI 用フォントです。

プログラムの部分で Python が使われているため GitHub 上では言語が Python ということになっていますが Python に限ったものではありません。

リポジトリ名inter
説明The Inter UI font family
説明(翻訳)inter UI フォントファミリー
URLhttps://github.com/rsms/inter
ホームページhttp://rsms.me/inter/
スター4045


14. wxpy


(中国語で書かれていて読めないのでスキップ)

リポジトリ名wxpy
説明微信机器人 / 可能是最优雅的微信个人号 API ✨✨
説明(翻訳)-
URLhttps://github.com/youfou/wxpy
ホームページhttp://wxpy.readthedocs.io
スター3850


15. TensorFlow-World


TensorFlow のチュートリアルです。

リポジトリ名TensorFlow-World
説明Simple and ready-to-use tutorials for TensorFlow
説明(翻訳)TensorFlow のシンプルで即使えるチュートリアル
URLhttps://github.com/astorfi/TensorFlow-World
ホームページ
スター3676


16. pysc2


Google が 2014 年に買収した DeepMind 社による、ゲーム「 StarCraft II 」の AI 学習環境です。

次のページがリリース記事のようです。

DeepMind and Blizzard open StarCraft II as an AI research environment | DeepMind

リポジトリ名pysc2
説明StarCraft II Learning Environment
説明(翻訳)StarCraft II の学習環境
URLhttps://github.com/deepmind/pysc2
ホームページ
スター3635


17. SerpentAI


ゲームをプレイするプログラムを作るためのフレームワークだそうです。

リポジトリ名SerpentAI
説明Game Agent Framework. Helping you create AIs / Bots to play any game you own! BETA
説明(翻訳)ゲームのエージェントのフレームワーク。あなたのどんなゲームでもプレイする AI 、ボッツを作成するのを助けます。 β 版です。
URLhttps://github.com/SerpentAI/SerpentAI
ホームページhttp://serpent.ai
スター3353


18. deepo


ディープラーニング用の Docker イメージです。

リポジトリ名deepo
説明A series of Docker images (and their generator) that allows you to quickly set up your deep learning research environment.
説明(翻訳)Docker イメージ(とそのジェネレーター)のシリーズです。これを使うと、ディープラーニングの研究環境を素早くセットアップすることができます。
URLhttps://github.com/ufoym/deepo
ホームページhttps://hub.docker.com/r/ufoym/deepo
スター3350


19. visdom


ウェブブラウザーベースのデータ可視化ツールです。

リポジトリ名visdom
説明A flexible tool for creating, organizing, and sharing visualizations of live, rich data. Supports Torch and Numpy.
説明(翻訳)ライブデータ、リッチなデータのビジュアルを作成・整理・共有するための柔軟なツールです。 Torch と Numpy をサポートしています。
URLhttps://github.com/facebookresearch/visdom
ホームページ
スター3310


20. seq2seq


機械翻訳に使用できる TensorFlow のエンコーダー / デコーダーのフレームワークです。

リポジトリ名seq2seq
説明A general-purpose encoder-decoder framework for Tensorflow
説明(翻訳)TensorFlow の汎用エンコーダー / デコーダーフレームワーク
URLhttps://github.com/google/seq2seq
ホームページhttps://google.github.io/seq2seq/
スター3217


21. sandsifter


x86 プロセッサーに対してファジング(ファズテスト)を行うためのツールのようです。

リポジトリ名sandsifter
説明The x86 processor fuzzer
説明(翻訳)x86 プロセッサーのファジングツール
URLhttps://github.com/xoreaxeaxeax/sandsifter
ホームページ
スター3201


22. WebHubBot


世界最大のアダルト動画サイトをクローリングするためのツールです。

動画のタイトル、動画の長さ、 mp4 リンク、 URL などを取得するそうです。

リポジトリ名WebHubBot
説明Python + Scrapy + MongoDB . 5 million data per day !!!💥 The world's largest website.
説明(翻訳)Python + Scrapy + MongoDB 。 1 日に 500 万データを取得。世界最大のウェブサイト。
URLhttps://github.com/xiyouMc/WebHubBot
ホームページ
スター3129


23. pygorithm


重要な基本的アルゴリズムを網羅した Python ライブラリです。

ソートや探索、経路探索、動的計画法、貪欲アルゴリズムといった、 CS の学生さんにお馴染みのさまざまなアルゴリズムのサンプルコードが入っています。

リポジトリ名pygorithm
説明A Python module for learning all major algorithms
説明(翻訳)すべてのメジャーなアルゴリズムを学ぶための Python モジュール
URLhttps://github.com/OmkarPathak/pygorithm
ホームページ
スター3124


24. awx


Ansible のウェブインタフェースを提供するためのライブラリのようです。

リポジトリ名awx
説明AWX Project
説明(翻訳)AWX プロジェクト
URLhttps://github.com/ansible/awx
ホームページ
スター3063


25. shadowbroker


クラッキンググループ Shadow Brokers が「 Lost In Translation 」という名前で公開した Windows などの脆弱性を突くコード(「エクスプロイト」)のようです。

リポジトリ名shadowbroker
説明The Shadow Brokers "Lost In Translation" leak
説明(翻訳)Shadow Brokers の「 Lost in Translation
」リーク
URLhttps://github.com/misterch0c/shadowbroker
ホームページ
スター3001


26. howmanypeoplearearound


同じ WiFi ネットワークを利用する人の数を数えるツールのようです。

リポジトリ名の howmanypeoplearearound は「 how many people are around 」の意味のようです。

リポジトリ名howmanypeoplearearound
説明Count the number of people around you by monitoring wifi signals
説明(翻訳)WiFi の信号をモニタリングしてあなたの周りにいる人の数を数えます。
URLhttps://github.com/schollz/howmanypeoplearearound
ホームページ
スター2981


27. baselines


強化学習アルゴリズムのベースを実装したコード集です。

研究者コミュニティがこれをベースに研究を進められることを目的に作られたようです。

リポジトリ名baselines
説明OpenAI Baselines: high-quality implementations of reinforcement learning algorithms
説明(翻訳)OpenAI Baselines: 強化学習アルゴリズムの高品質な実装
URLhttps://github.com/openai/baselines
ホームページ
スター2972


28. apistar


ドキュメント付きの API サイトを作成するためのフレームワークです。

リポジトリ名apistar
説明A smart Web API framework, designed for Python 3. 🌟
説明(翻訳)Python 向けに設計されたスマートなウェブ API フレームワーク
URLhttps://github.com/encode/apistar
ホームページhttps://discuss.apistar.org/
スター2938


29. pytorch-CycleGAN-and-pix2pix


画像から別の画像を自動生成する( image-to-image translation の)ためのアルゴリズムの Python 実装です。

CycleGAN と Pix2pix という、その筋では有名な画像変換のアルゴリズムを実装しており、 README では画像内の馬をしまうまに変えたり、線画を猫に変えたりするサンプル(オリジナル研究者が出したもの?)が紹介されています。

リポジトリ名pytorch-CycleGAN-and-pix2pix
説明Image-to-image translation in PyTorch (e.g. horse2zebra, edges2cats, and more)
説明(翻訳)PyTorch での画像変換(例: horse2zebra / edges2cats その他)
URLhttps://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
ホームページ
スター2791


30. fashion-mnist


MNIST 風の、衣服の画像のデータベースです。

MNIST に馴染みの無い方に説明すると、 MNIST database というのは「 Modified National Institute of Standards and Technology database 」の略で、手書きの数字画像のデータベースのことです。マシンラーニングの研究や練習の定番として使われています。

リポジトリ名fashion-mnist
説明A MNIST-like fashion product database. Benchmark :point_right:
説明(翻訳)MNIST 風のファッションプロダクトデータベース。
URLhttps://github.com/zalandoresearch/fashion-mnist
ホームページhttp://fashion-mnist.s3-website.eu-central-1.amazonaws.com/
スター2774


31. Pokemon-Terminal


名前のとおり、ポケモンのターミナルのテーマ集です。

README に書いてあるのを読むと 719 体のポケモンのテーマがあるそうです。世界のポケモンですね。

任天堂(株式会社ポケモン)に許可を取っていないのではないかとも思いますが、おしゃれでかわいいです。

リポジトリ名Pokemon-Terminal
説明Pokemon terminal themes.
説明(翻訳)ポケモンのターミナルテーマ。
URLhttps://github.com/LazoCoder/Pokemon-Terminal
ホームページ
スター2657


32. ParlAI


Python で実装された、会話の AI 研究のフレームワークです。

ちなみに ParlAI は「パーレイ」と読むそうです。

リポジトリ名ParlAI
説明A framework for training and evaluating AI models on a variety of openly available dialog datasets.
説明(翻訳)さまざまな会話データセットに対する API モデルのトレーニングと評価のためのフレームワーク。
URLhttps://github.com/facebookresearch/ParlAI
ホームページparl.ai
スター2550


以上です。興味のある方は各リポジトリの README などをご覧になってみてください。

尚、スター数は 2017 年 12 月 31 日時点で確認した数字です。

違うブログですが、次の投稿では言語を制限せず「 2017 年リリースの GitHub リポジトリのうちスター数が 1 万を越えているもの」をリストアップしてみました。こちらも興味のある方はよろしければ。

2017 年リリースのスター 1 万越え GitHub リポジトリ | gotohayato

2017/12/21

Python Tips: Mac の .DS_Store を除外して zip ファイルを作成したい

Python で、 MacOS で自動作成される .DS_Store ファイルを除外した形で zip ファイルを作成する方法をご紹介します。

まずは .DS_Store とは何ぞやというそもそものところを確認した上で具体的な方法を見ていきましょう。

.DS_Store とは


MacOS を使っている方にはおなじみですが、 .DS_Store ファイルとは、フォルダのメタ情報を格納したファイルです。 MacOS に特有のもので、 GUI 関連の情報を格納しているようです。具体的には、アイコンの位置、背景画像などの情報が含まれるようです。

.DS_Store は Desktop Services Store の略で DS Store だそうです。

英語の Wikipedia の説明を一部抜粋します。

In the Apple macOS operating system, .DS_Store is a file that stores custom attributes of its containing folder, such as the position of icons or the choice of a background image. The name is an abbreviation of Desktop Services Store, reflecting its purpose. It is created and maintained by the Finder application in every folder, and has functions similar to the file desktop.ini in Microsoft Windows.

意訳:

Apple の OS macOS において、 .DS_Store はフォルダのカスタム属性を格納するファイルです。アイコンの位置や背景画像などの情報を格納しています。名前は Desktop Services Store の省略形です。 Finder アプリが各フォルダに対して作成・管理しており、 Microsoft Windows の desktop.ini に似た機能を持っています。



使用するもの


この .DS_Store ファイルを除外した形でディレクトリの zip ファイルを作成する方法ですが、いくつかのアプローチが考えられます。

今回は標準ライブラリのみを使った方法のうち、 zip ファイルを扱うためのライブラリ zipfile と Python 3.4 で導入された pathlib.Path を使う方法をご紹介します。

  • zipfile
  • pathlib.Path


コード


早速ですが、実際のコードを見てみましょう。

import zipfile
from pathlib import Path
from typing import Iterable, List


settings = {
    'verbose': False,
}


def compress_dir(zip_out: Path, directory: Path, skipped_names: Iterable[str]):
    '''指定されたディレクトリを指定された名前で zip ファイルに圧縮する
    '''
    if zip_out.exists():
        message = 'Specified zip file already exists: "{}".'.format(zip_out)
        raise CompressionError(message)

    with zipfile.ZipFile(str(zip_out.absolute()), 'w') as z:
        if settings['verbose']:
            print('Zip file has been initialized: "{}".'.format(z.filename))
        for f in iter_all_files(directory):
            if f.name in skipped_names:
                if settings['verbose']:
                    print('Skipped: "{}".'.format(f))
                continue

            z.write(f)
            if settings['verbose']:
                print('Added: "{}".'.format(f))


def iter_all_files(directory: Path) -> List[Path]:
    '''指定されたディレクトリの下にあるすべてのファイル( Path )を下層のものも含めて返すイテレータを返す
    '''
    if not directory.is_dir():
        message = 'Specified directory is not found: "{}".'.format(directory)
        raise CompressionError(message)

    return directory.glob('**/*.*')


class CompressionError(Exception):
    '''zip 圧縮プロセスで発生するエラーを表すカスタム例外
    '''
    pass

この関数 compress_dir() は、指定されたディレクトリ diretory を zip ファイル zip_out として圧縮する関数です。第 3 引数 skipped_names で指定された名前のファイルはスキップします。

これを次のように使用すると、 .DS_Store ファイルを除外した形でディレクトリ「圧縮対象ディレクトリ」を zip 圧縮することができます。

zip_file = Path('サンプル.zip')
directory = Path('圧縮対象ディレクトリ')
skipped_names = ('.DS_Store', )

try:
    compress_dir(zip_file, directory, skipped_names)
except CompressionError as e:
    # TODO 文脈によってより適切な例外処理に差し替える
    raise e

以下にポイントをいくつか取り上げてみます。

zipfile.ZipFile は Python 3.2 以降で context manager として使えるようになっているので、 with ... as ... 構文で使用しています。

カスタム例外の CompressionError は、次の 2 つのケースで上がるようになっています。

  • zip ファイルがすでに存在するとき
  • 指定されたディレクトリが存在しないとき


完全なスクリプトのサンプル


この compress_dir() を使ってスクリプトを作った場合のサンプルを GitHub Gist に置いたので、興味のある方はご覧になってみてください。 argparse を使って、コマンドラインの引数、オプション引数を受け付けるようにしています。



以上、 Python で Mac の .DS_Store を除外して zip ファイルを作成する方法についてでした。

この記事に興味のある方は次の記事も参考になるかもしれません。

Python Tips:zip ファイルをインターネットからダウンロードして利用したい - Life with Python

zip ファイルの zip ではなくて Python の組み込み関数の zip() の方に興味のある方は次の記事などが参考になるかもしれません。

Python Tips:複数のリストに対してループを回したい - Life with Python
Python Tips:長い方のリストに合わせて zip したい - Life with Python