目的別におすすめの文字列連結方法です。
Python には、色々と良きに計らってくれる関数が、標準で用意されていました。
開発効率がグッと良くなって、とてもありがたかったです。
短い文字列なら +演算子
短い文字列を連結するなら、『+ 演算子』で、サクッと連結するのがおすすめです。
1行で完結するような『ちょっとした文字列』を連結するケースでは、足し算記号を使うのが高速でした。
Python マニュアル
共通のシーケンス演算(s + t の演算結果は s と t の結合)
リストやタプルの文字列なら str.join()
list や tuple の中身を連結するなら、『ジョインメソッド str.join(リストやタプル)
』がおすすめです。リストの中に文字列をためておいて、最後にサクッと連結します。爽快でした。
『+演算子』や『+=演算子』だと遅かった処理が、str.join()
だとスムーズに完了しました。
Python マニュアル
ジョインメソッド str.join(iterable)
文字列に変数を埋め込むなら f'' str.format() %
文字列の中に変数を埋め込みたいときは、『文字列フォーマット』で連結するのがおすすめです。
自分は、『エフストリング f''
』と『フォーマットメソッド str.format()
』と『パーセント %
』の3種類の方法を、よく使っています。
どれを使ったらいいのか?
自分は、速攻で『エフストリング f''
』を使っています。読み方ですが、YouTube で『エフストリング f-string』って言ってる人がいたので、そう呼んでいます。
この方法の良いところは、なんといっても f'文字列を書きながら{変数とか関数}を埋め込めるところ'
です。
『書きやすくて、読みやすい!』
Python マニュアル
エフストリング f''
(フォーマット済み文字列リテラル)
でも、『エフストリング f''
』には苦手分野がありました。
{変数とか関数}
の中に、改行文字 '\n'
とかタブ文字 '\t'
を『直接』書くことができませんでした。
こういったエスケープが必要な文字を、変数に入れずに f'{"\n"}'
とか f'{"".join(["\n", "\t"])}'
のように書いたら、SyntaxError になりました。
SyntaxError: f-string expression part cannot include a backslash
コードとして解釈するカッコ {}
の中では、エスケープ用の backslash が書けない。カッコ {}
の外なら良いけど、中には書けない。『文字列の中にコードを書く』という複雑さゆえに、これは仕方がないところだと思います。
そんなときに便利なのが、『フォーマットメソッド str.format()
』でした。
Python マニュアル
フォーマットメソッド str.format(*args, **kwargs)
'{a}'.format(a='\n')
とか '{a}'.format(a=''.join(['\n', '\t']))
といった書き方ができました。エフストリングのような見やすさはないですが、代わりに記述の自由度が高くて便利でした。
しかしながら、フォーマットメソッドは『ちょっとだけ』コードが長かったです。
代わりに、『パーセント %
』を使った方法が『ちょっとだけ』短く書けて便利でした。
'%s%s' % ('\n', '\t')
のように書けました。
Python マニュアル
パーセント %(printf 形式の文字列書式化)
辞書 dict() を渡すと、変数を埋め込んで f''
や str.format()
のように使うことができました。
'%(a)s%(b)s' % dict(a='\n', b='\t')
と書いたりできました。
この書き方は、ログの出力フォーマットの指定でも使われていました。
%(asctime)s
とか %(message)s
とか。
このあたりは、『LogRecord 属性』の表にいろいろ載っていました。
Python マニュアル
LogRecord 属性(ログレコード属性)
ファイルパスなら pathlib
文字列の中でも、ファイルパスを扱うなら『pathlib』がおすすめです。
Python マニュアル
パスリブ pathlib — オブジェクト指向のファイルシステムパス
p=pathlib.Path(r'ファイルパス')
で、準備完了です。
p.parent
で親フォルダパスを取得。
p.parent.joinpath('data')
で、親フォルダの下にパス文字列 'data'
を連結。
パスを操作するたびに、新しいパスオブジェクトが、戻り値として返ります。
Python マニュアル
パス class pathlib.Path(*pathsegments)
ペアレント PurePath.parent
ジョインパス PurePath.joinpath(*other)
パスを『普通の文字列』として取得する方法です。
str() 関数に渡して t=str(p)
とします。パスを pathlib 未対応のライブラリにわたすときに、良く使っています。
pathlib は、とても良かったです。
ディーアイアーネーム os.path.dirname()
や ジョイン os.path.join()
で、2重3重に囲む必要がなくなりました。パス文字列の連結なら、『pathlib』がおすすめです。
ファイル名を変えるならウィズネーム p.with_name(name)
が便利でしたし、拡張子を変えるならウィズサフィックス p.with_suffix(suffix)
が便利でした。開発効率がグッと上がりました。
Python マニュアル
ウィズネーム PurePath.with_name(name)
ウィズサフィックス PurePath.with_suffix(suffix)
URL なら urllib.parse
文字列の中でも、ウェブの URL を連結するときは、ユーアールエルリブパース urllib.parse にある『ユーアルエルジョイン urllib.parse.urljoin()
』と『ユーアルエルアンパース urllib.parse.urlunparse()
』がおすすめです。
Python マニュアル
ユーアルエルジョイン urllib.parse.urljoin(base, url, allow_fragments=True)
ユーアルエルアンパース urllib.parse.urlunparse(parts)
URL 文字列の連結を、色々と良きに計らって処理してくれました。
目的に応じた文字列連結用の関数はおすすめ
Python の標準ライブラリには、目的に応じた文字列連結用の関数が用意されていました。
コードが見やすくスッキリまとまって、開発効率が格段にアップしました。
とてもありがたいです。