Pythonで文字列を連結する方法の目的別おすすめ

目的別もくてきべつにおすすめの文字列連結方法です。

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 の標準ライブラリには、目的に応じた文字列連結用の関数が用意されていました。

コードが見やすくスッキリまとまって、開発効率が格段にアップしました。

とてもありがたいです。

タイトルとURLをコピーしました