Python ファイルやフォルダ操作 覚えておくべき19の方法

'21/08/01更新
 本記事では、ファイルやフォルダの頻出操作19の雛形コードを載せました。
1. フォルダパスやファイルパスをos.path.join()で作成する方法
2. 逆に、ファイルパスやファイル名をos.path.filename()で取得する方法
3. ファイルの操作関連
 ・ファイルやフォルダをコピーや削除する方法 shutil.copy2(,)  shutil.rmtree()
 ・フォルダ内を再帰的に探索する方法 os.walk()
 ・ファイル名をリストで取得 glob.glob('./*.csv')
 ・ファイルリストをソートする 
 ・フォルダをzip圧縮する。解凍(展開)する。
 
本コードの実行例は下図の通りです。

f:id:HK29:20200301180933p:plain

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import shutil
import glob
import re

import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")

def main():
    # 1. カレントディレクトリのパスを取得
    current_path = os.getcwd()
    print(1, current_path)
    
    filename = now + '_file.csv' # ファイル名の作成

    ##### ファイルやフォルダのパスを作成する
    # 2. ディレクトリパスの作成
    dirpath_list = [current_path, 'sub_dir']
    dirpath = os.path.join(*dirpath_list)
    print(2, dirpath)

    # 3. ディレクトリの作成
    os.mkdir(dirpath)
    
    # 4. ファイルパスの作成その1:ディレクトリパス+ファイル名
    filepath = os.path.join(dirpath, filename)
    print('4_1', filepath)
    
    # 4. ファイルパスの作成その2:ディレクトリパス+サブディレクトリ名+ファイル名
    filepath_list = [os.getcwd(), 'sub_dir', filename]
    filepath_2 = os.path.join(*filepath_list)
    print('4_2', filepath_2)
    
    # ファイルを作成する例
    data_list = [1, 2, 3, 4, 'abc']
    str_list = list(map(str, data_list)) # リスト内の要素を文字型へ変換
    str_list = '\n'.join(str_list) # 各要素に改行コードを付与
    with open(filepath, 'w', encoding='utf-8') as f:
        for row in str_list:
            f.write(row)
    
    ##### ファイルやフォルダパスから名前を取得する
    # 5. ディレクトリ名の取得
    dirname = os.path.dirname(filepath)
    print(5, dirname)

    # 6. サブディレクトリ名の取得
    subdirname = os.path.basename(os.path.dirname(filepath))
    print(6, subdirname)

    # 7. ファイル名を取得(拡張子有り)
    filename = os.path.basename(filepath)
    print(7, filename)

    # 8. ファイル名を取得(拡張子なし)
    num = filename.rfind('.')
    filename = filename[:num]
    print(8, filename)

    # 9. ディレクトリパスとファイル名を同時に取得
    dirpath, filename = os.path.split(filepath)
    print(9, dirpath, filename)

    ##### ファイルやフォルダを操作する
    # 10. ファイルをコピーする
    shutil.copy2(filepath, current_path)
    
    # 11. フォルダを中身ごとコピーする
    shutil.copytree(dirpath, dirpath + '_backup')
    
    # 12. フォルダをサブフォルダやファイルなどの中身ごと削除
    shutil.rmtree(dirpath)
    
    # 13. ファイルの存在を確認
    print(13, os.path.isfile(filepath))
    
    # 14. フォルダの存在を確認
    print(13, os.path.isdir(dirpath + '_backup'))    
    
    # 15. フォルダ内を再帰的に探索する
    print('15')
    for dirpath, dirnames, fnames in os.walk(os.getcwd()):
        print('dirpath:' ,dirpath)
        print('dirnames:' ,dirnames)
        print('fnames:' ,fnames)
    
    # 16. 指定フォルダ内を正規表現で、複数のファイル名をリストで取得
    file_names = glob.glob('./*.csv')
    print(16, file_names) 
    
    # 17. ファイルリストを番号順にソートする。reモジュールを利用する
    file_names = sorted(file_names, key=lambda x:int((re.search(r"[0-9]+", x)).group(0)))
    print(17, file_names) 

# 18. フォルダを圧縮する。引数は順に、(圧縮後ファイル名、圧縮フォーマット、フォルダパス)
shutil.make_archive('csv_files', 'zip', root_dir = dirpath)
# 19. フォルダを解凍する。引数は順に、(圧縮ファイル名、解凍先)
shutil.make_archive('csv_files.zip', extract_dir = '.')
if __name__ == '__main__': main()

以上

<広告>