LoginSignup
7
7

More than 5 years have passed since last update.

Pythonステップアップ講座 ~文字列処理~

Last updated at Posted at 2018-01-22

最近 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()

力尽きたのでこの辺で。

7
7
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7