pythonで試したことをログとして残します。
マニュアルを読めば分かるような基本的な記事が多くなります。
1. ファイルシステムパス : pathlib
ファイル操作は大事ですが操作方法を深く理解することなく必要に応じて検索して対応していました。
今後のためにも操作方法について調べてまとめます。
1.1. os vs pathlib
調べて見ると”os”と”pathlib”を使用した2種類のファイル操作方法を見つけることができます。
pathlibがオブジェクト志向で洗練されているように思います。
今後はpathlibの使用で問題ないと思います。
1.2. Pathインスタンスの作成
pathlibを使用するにはPathインスタンスを作成します。
Pathインスタンスのメソッドやプロパティを使用して操作します。
from pathlib import Path
path1 = Path()
path2 = Path('dir/test.py')
path1: 引数を省略するとカレントディレクトリ'.'でインスタンスを作成します。 |
1.3. 絶対パスの取得:resolve
resolveを使用します。
absoluteも使用できるようですが動作にほんの少しの違いがあるそうです。
absoluteはマニュアルには記載がないし、resolveの方が安全なのでresolveを使用します。
path2.resolve()
1.4. ファイル検索
glob('*')を使用することでファイルを検索できます。
返り値はジェネレータなので必要に応じてリストに変換します。
list(path1.glob('*'))
1.5. 再帰的なファイル検索
glob('**/*')を使用することでファイルを検索できます。
マニュアルに記載されています。 |
list(path1.glob('**/*'))
1.6. ファイル名、拡張子、ディレクトリ、拡張子を除去したファイル名
下記プロパティを使用することで取得できます。
-
name
-
suffix
-
parent
-
stem
path2.name
path2.suffix
path2.parent
path2.stem
2. ジェネレータの連結
ジェネレータの連結方法を調べましたが簡単ではなさそうです。
2.1. 情報源
2つの方法が提案されています。
-
itertools.chain()を使用
-
chain関数を自作する方法
itertools.chain()を使用する方法では返り値がジェネレータではなくイテレータになってしまうというコメントがありました。
返り値としてジェネレータが欲しい場合にはchain関数を自作しなければなりません。
通常の用途ではitertools.chain()を使用する方法で事足りそうです。
2.2. itertools.chain()を使用
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関数を自作する方法
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)