PythonのString Formattingを拡張

Python 3で追加されたformatを使うと文字列操作が便利になります。

使い方は次のような感じです。(参考:Pythonの新しい文字列書式操作

>>> '{0} + {1} = {2}'.format(1, 2, 1+2)
'1 + 2 = 3'

string.Formatterを継承すると、この文字列操作を拡張することができるそうです。

拡張の仕方は以下のような感じです。

class Formatter(string.Formatter):
  def format_field(self, value, spec):
    # 必要な処理
    return 'value'

サンプル

このstring.Formatterを継承してupperlowerを書式指定文字列に使うと大文字・小文字に変換するサンプルを作ってみました。

import string
class Formatter(string.Formatter):
  def format_field(self, value, spec):
    if spec == 'upper': value, spec = value.upper(), ''
    elif spec == 'lower': value, spec = value.lower(), ''
    return super(Formatter, self).format_field(value, spec)

使い方は以下のような感じです。

>>> f = Formatter()
>>> f.format('{name} {name:upper} {name:lower}', name='Alice')
'Alice ALICE alice'

template engine

このString Formattingを使ってtemplate engineのようなことを実装したサンプルのようなものも公開されているみたいです。

GitHub – ebrehault/superformatter
https://github.com/ebrehault/superformatter

repeatcallifに対応していて、次のような感じで使えます。

>>> from engine import SuperFormatter
>>> sf = SuperFormatter()
>>> print(sf.format('{n:repeat:n={{item}}\n}', n=[2,3,5,7]))
n=2
n=3
n=5
n=7

現状ではサンプル程度のものかと思いますが、面白そうなテクニックかなと思います。

リンク

string — Common string operations — Python 3.7.2 documentation
https://docs.python.org/3/library/string.html

The world’s simplest Python template engine — Makina Corpus
https://makina-corpus.com/blog/metier/2016/the-worlds-simplest-python-template-engine

Pythonでファイルをコピーする方法

Pythonでファイルをコピーしたい場合はshutilモジュールのcopyが使えます。

>>> import shutil
>>> shutil.copy('/path/to/src', '/path/to/dst')

ファイルの作成時刻や変更時刻などはコピーされませんので、必要に応じてcopystatも追加してください。

>>> shutil.copy('/path/to/src', '/path/to/dst')
>>> shutil.copystat('/path/to/src', '/path/to/dst')
>>> import os, time
>>> time.strftime('%Y-%m-%d %I:%M:%S', time.localtime(os.path.getmtime('/path/to/src')))
'2018-11-21 09:58:03'
>>> time.strftime('%Y-%m-%d %I:%M:%S', time.localtime(os.path.getmtime('/path/to/dst')))
'2018-11-21 09:58:03'

Pythonでファイル作成時刻や最終更新時刻を取得する方法についてはこちらも参考にしてください。


copyはディレクトリに対しても実行可能なようです。

Pythonでファイルの作成時刻や最終更新時刻を取得する方法

Pythonでファイルの作成時刻や最終更新時刻を取得するにはgetctimegetmtimeを使うと良いそうです。

使い方は次のような感じです。

作成時刻

>>> import os
>>> os.path.getctime('/path/to/file')
1542761883.7563891

最終更新時刻

>>> os.path.getmtime('/path/to/file')
1542761883.7563891

最終アクセス時刻

>>> os.path.getatime('/path/to/file')
1542761883.7563891

戻り値はepochからの経過秒数になっています。timeモジュールを使うと読み易い形に変換できます。

>>> import time
>>> time.strftime('%Y-%m-%d %I:%M:%S', time.localtime(1542761883.7563891))
'2018-11-21 09:58:03'