最近 Python 3.X に移行した。Python 2.X と比べて文字列回りも便利になっているのでまとめ。知識のアップデートにどうぞ。コメントも歓迎。
フォーマッティング
Hello World
を出力してみよう。まずはシンプルに↓
>>> h, w = "Hello", "World"
>>> h + ' ' + w
'Hello World'
Python 2ではこれが多いやり方だった↓
>>> h, w = "Hello", "World"
>>> '%s %s' %(h,w)
'Hello World'
変数が多いとわかりずらいのでこんな書き方もできる↓
>>> h, w = "Hello", "World"
>>> '%(h)s %(w)s' % locals()
'Hello World'
>>> '%(h)s %(w)s' % {"h":h, "w":w}
'Hello World'
format関数を使うのが Python3 での標準だと思う↓ よく読んでマスターしよう
https://docs.python.jp/3/library/string.html#format-string-syntax
>>> h, w = "Hello", "World"
>>> "{} {}".format(h,w)
'Hello World'
>>> "{0} {1}".format(h,w)
'Hello World'
>>> "{h} {w}".format(h=h,w=w)
'Hello World'
>>> "{h} {w}".format(**locals())
'Hello World'
Python 3.6 だとこんな書き方もできる。めちゃくちゃ便利↓
https://docs.python.jp/3/reference/lexical_analysis.html#formatted-string-literals
>>> h, w = "Hello", "World"
>>> f"{h} {w}"
'Hello World'
右づめ、ゼロパディング、3桁ごとのカンマ挿入、有効数字の指定なども当然できるので押さえておく↓
>>> "{:>10}".format("Hello")
' Hello'
>>> "{:05d}".format(10)
'00010'
>>> "{:,d}".format(10000)
'10,000'
>>> "{:.3f}".format(3.141592)
'3.142'
面白いのはオブジェクトを渡すことが出来る点。オブジェクトの __str__()
を呼び出したり、 __repr__()
を呼び出したりできる↓
>>> class A(object):
... def __str__(self): return "Hello World"
... def __repr__(self): return "Hello"
...
>>> a = A()
>>> f"{a}"
'Hello World'
>>> f"{a!s}"
'Hello World'
>>> f"{a!r}"
'Hello'
f書式ではオブジェクトの変数も渡せる↓
>>> a = type('',(),{})
>>> a.hello = "world"
>>> f"{a.hello}"
'world'
マルチバイト・エンコーディング周り
python2で日本語を扱う場合こんな感じ
- スクリプト内でのマルチバイト文字
- ファイル冒頭に
#coding:utf8
などエンコーディングを指定 - u書式を使ってこんな感じで指定する
hello = u"こんにちは"
- こうやってもよいが、、、やめた方がいいかも
hello = "こんにちは".decode("utf8")
- ファイル冒頭に
- ストリームからのマルチバイトの入力
- データを読んで
decode
を呼び出す:data = open("a.text").read().decode("utf8")
- データを読んで
- ストリームへのマルチバイトの出力
- エンコードして書き込み:
open("output.txt", "w").write(data.encode("utf8"))
- エンコードして書き込み:
python3 ではマルチバイト対応ができている
- スクリプト内でのマルチバイト文字
- ファイル冒頭に
#coding:utf8
などエンコーディングを指定 - こんな感じで指定する
hello = "こんにちは"
- これはエラーになる。decodeは不要(もうされている)
hello = "こんにちは".decode("utf8")
- ファイル冒頭に
- ストリームからのマルチバイトの入力
- ファイル開くときにエンコーディングの指定
open("a.txt", encoding="utf8").read()
- ファイル開くときにエンコーディングの指定
- ストリームへのマルチバイトの出力
- エンコードして書き込み:
a = open("text.txt", "w", encoding="utf8"); a.write("こんにちは"); a.close()
- エンコードして書き込み:
力尽きたのでこの辺で。