やましなぶろぐ

python_study: pythonで試したことなどのログ

pythonで試したことをログとして残します。

🕒 Last mod: 2020-08-31


pythonで試したことをログとして残します。
マニュアルを読めば分かるような基本的な記事が多くなります。

1. ファイルシステムパス : pathlib

ファイル操作は大事ですが操作方法を深く理解することなく必要に応じて検索して対応していました。

今後のためにも操作方法について調べてまとめます。

1.1. os vs pathlib

調べて見ると”os”と”pathlib”を使用した2種類のファイル操作方法を見つけることができます。

pathlibがオブジェクト志向で洗練されているように思います。

今後はpathlibの使用で問題ないと思います。

1.2. Pathインスタンスの作成

pathlibを使用するにはPathインスタンスを作成します。

Pathインスタンスのメソッドやプロパティを使用して操作します。

Path.py
from pathlib import Path
path1 = Path()
path2 = Path('dir/test.py')
path1: 引数を省略するとカレントディレクトリ'.'でインスタンスを作成します。

1.3. 絶対パスの取得:resolve

resolveを使用します。

absoluteも使用できるようですが動作にほんの少しの違いがあるそうです。

absoluteはマニュアルには記載がないし、resolveの方が安全なのでresolveを使用します。

Path.py
path2.resolve()

1.4. ファイル検索

glob('*')を使用することでファイルを検索できます。

返り値はジェネレータなので必要に応じてリストに変換します。

Path.py
list(path1.glob('*'))

1.5. 再帰的なファイル検索

glob('**/*')を使用することでファイルを検索できます。

マニュアルに記載されています。
Path.py
list(path1.glob('**/*'))

1.6. ファイル名、拡張子、ディレクトリ、拡張子を除去したファイル名

下記プロパティを使用することで取得できます。

  1. name

  2. suffix

  3. parent

  4. stem

Path.py
path2.name
path2.suffix
path2.parent
path2.stem

2. ジェネレータの連結

ジェネレータの連結方法を調べましたが簡単ではなさそうです。

2.1. 情報源

How to join two generators in Python?

2つの方法が提案されています。

  1. itertools.chain()を使用

  2. chain関数を自作する方法

itertools.chain()を使用する方法では返り値がジェネレータではなくイテレータになってしまうというコメントがありました。

返り値としてジェネレータが欲しい場合にはchain関数を自作しなければなりません。

通常の用途ではitertools.chain()を使用する方法で事足りそうです。

2.2. itertools.chain()を使用

by.itertools.chain.py
import itertools

g1 = path.glob('*.json')
g2 = path.glob('*.json')
g3 = path.glob('*.json')

by_itertools = itertools.chain(g1, g2, g3)
type(by_itertools)
list(by_itertools)

2.3. chain関数を自作する方法

by.chain.py
def chain(*iterables):
  for iterable in iterables:
    yield from iterable

g1 = path.glob('*.json')
g2 = path.glob('*.json')
g3 = path.glob('*.json')

by_chain = chain(g1, g2, g3)
type(by_chain)
list(by_chain)