pythonメモ
pathlibまとめ
存在するファイルの場合
code:python
import pathlib
p = pathlib.Path("C:/somedir/subdir/filename.ext")
# ファイル名、ディレクトリ取得
p.name #<-- 'filename.ext'
p.suffix #<-- '.ext' (ドットを含む)
p.stem #<-- 'filename'
p.parent #<-- WindowsPath('C:/somedir/subdir')
p.parents #<-- 'C:\somedir\subdir', 'C:\somedir', 'C:\' #実際は<WindowsPath.parents>
# 存在チェック
p.exists() #<-- True
# 種別チェック
p.is_File() #<-- True
p.is_Dir() #<-- False
存在するフォルダの場合
code:python
p = pathlib.Path("C:/somedir/subdir")
p.name #<-- 'subdir'
p.suffix #<-- ''
p.stem #<-- 'subdir'
p.parent #<-- WindowsPath('C:/somedir')
p.parents #<-- 'C:\somedir', 'C:\' #実際は<WindowsPath.parents>
# 存在チェック
p.exists() #<-- True
# 種別チェック
p.is_File() #<-- False
p.is_Dir() #<-- True
存在しないファイル/フォルダの場合
code:python
p = pathlib.Path("C:/somedir/subdir/notfound.ext") #存在しないファイルパス
p.exists() #<-- False
p.is_File() #<-- False
p.is_Dir() #<-- False
存在しないファイル/フォルダはファイルでもフォルダでもない
パスの接続
スラッシュで階層を連結できる
連結する要素のどれかひとつがpathlib.Pathであれば良い
code:python
p = pathlib.Path("c:/somedir")
pp = p / "newdir / "filename.ext"
pp #<-- WindowsPath('c:/somedir/newdir/filename.ext')
文字列への変換
code:python
p = pathlib.Path("C:/somedir/subdir/filename.ext")
p #<-- WindowsPath('C:/somedir/subdir/filename.ext')
str(p) #<-- 'C:/somedir/subdir/filename.ext'
p._str #<-- 'C:/somedir/subdir/filename.ext'
Import関連
モジュールはクラスではない
code:python
from PIL import Image
→VScode上でエラーになる(昔はこれで動いていたし、実際にこれでも動く)。正しくは
code:python
from PIL.Image import Image
外部pythonスクリプトの実行
外部スクリプトを取り込むにはimportを使う。
code:python
# 同フォルダ内のmy_moduke.pyを取り込む
import my_module
#from . import my_module でもOK
上記は、対象スクリプトが同じフォルダ内にあるときに有効。
code:text
.
├── my_module.py
└── main.py
サブディレクトリにあるスクリプトを呼び出したい、つまり
code:text
.
├── subdir
│ └── my_module.py
└── main.py
であるとき、以下のようにする。
code:python
from subdir import my_module
#import subdir.my_module でもOK
ちなみに、使いやすいように名前を付け替えることができる。
code:python
from chomlib import file as cfile
#import chomlib.file as cfile でもOK
import 文が実行されたタイミングでスクリプトも実行される。
ただしスクリプトの内容が
code:python
if __name__ == '__main__':
...
とされている場合、importしただけでは...部は実行されない。
基本的には、外部スクリプトも任意のタイミングで実行したいはずなので
code:python
def main(target_file):
# メインの処理
...
return
if __name__ == '__main__':
argv = sys.argv()
# ...のように単体実行した際のコマンドラインオプションのチェックなど
...
main(target_file) #メインの処理を実行
exit(0)
のように書くのが通例である。こうしておけば、スクリプトを呼び出す側で以下のように実行できる。
code:python
import my_module
...
my_module.main(target_file)
リストの比較
リストの中に(単一の)要素が含まれているか
code:py
li = "a", "b", "c"
if "a" in li:
print("found")
これを応用すればORの代わりとして使える
code:py
if x == "a" or x == "b" or x == "c":
print("x is a or b or c")
↓
code:py
if x in "a", "b", "c":
print("x is a or b or c")
2つのリストの内容が全く同じか
code:py
nums_a = 1, 2, 3
nums_b = 1, 2, 3
nums_c = 2, 3, 1
print(nums_a == nums_b) #<-- True
print(nums_a == nums_c) #<-- False
単純な等号による比較。各要素の並びも内容も全く同じでないとならない。
2つのリストに含まれる要素の内容が同じか。※順番は問わない
順番を問わないなら集合(set)に変換してから比較すれば良い。
ただし集合に変換した時点で重複する要素が統合されてしまうので、要素が重複する可能性があるなら意図した比較はできないかもしれない。
code:py
nums1 = 1, 2, 3
nums2 = 3, 2, 1
nums3 = 2, 3, 1
nums4 = 1, 2, 3, 4
nums5 = 1, 1, 2, 3
# それぞれset関数でsetに変換してから比較
print(set(nums1) == set(nums2)) #<-- True
print(set(nums1) == set(nums3)) #<-- True
print(set(nums1) == set(nums4)) #<-- False
print(set(nums1) == set(nums5)) #<-- True (重複している1が統合されてしまうため)
2つのリストの中に共通する要素があるか
集合(set)の積を取る。積は&
code:py
l1 = "a", "b", "c"
l2 = "c", "d", "e"
print(set(l1) & set(l2)) #<-- {"c"}