python ファイル操作関係まとめ

```python:
#Working With Files in Python
#https://realpython.com/working-with-files-in-python/

#python3
import　os
from pathlib import Path
import shutil

#filepathからファイル名取得
    basename = os.path.basename(filepath)
    basename_without_ext = os.path.splitext(os.path.basename(filepath))[0]

#ファイルの存在確認                         
    cwd = os.getcwd()                        
    cwd_f = cwd + "/"+filename               
    if os.path.isfile(cwd_f) == True         

#ファイル読み取り
    #https://dbader.org/blog/python-file-io
    with open('data.txt', 'r') as f:
        data = f.read()
        print('context: {}'.format(data))
    
#ファイル読み取り＆編集
    with open('data.txt', 'w') as f:
        data = 'some data to be written to the file'
        f.write(data)
    
#フォルダー＆ファイルリストの取得
#フォルダー構造
    # my_directory
    # ├── file1.py
    # ├── file2.csv
    # ├── file3.txt
    # ├── sub_dir
    # │   ├── bar.py
    # │   └── foo.py
    # ├── sub_dir_b
    # │   └── file4.txt
    # └── sub_dir_c
        # ├── config.py
        # └── file5.txt
    #方法１
    entries = os.listdir('my_directory')#entriesはリスト
    for entry in entries:
        print(entry)
    #→['file1.py', 'file2.csv', 'file3.txt', 'sub_dir', 'sub_dir_b', 'sub_dir_c']

    #方法２　python 3.5以後
    with os.scandir('my_directory') as entries:#entriesはイテレータ
    for entry in entries:
        print(entry.name)
        
    #方法3　python 3.4以後
    entries = Path('my_directory')
    for entry in entries.iterdir():
        print(entry.name)

#サブフォルダを含むリスト取得
    for dirpath, dirname, files in os.walk('.'):
       　print(f'Found directory: {dirpath}')
       　for file_name in files:
           　print(file_name)

#ファイル判断
    #方法１
    for entry in os.listdir(basepath):
        if os.path.isfile(os.path.join(base_path, entry)):
            print(entry)
    #方法２　python 3.5以後
    with os.scandir(basepath) as entries:
        for entry in entries:
            if entry.is_file():
                print(entry.name)
    #方法3　python 3.4以後
    basepath = Path('my_directory')
    for entry in basepath.iterdir():
        if entry.is_file():
            print(entry.name)
    # or
    basepath = Path('my_directory')
    files_in_basepath = (entry for entry in basepath.iterdir() if entry.is_file())
    for item in files_in_basepath:
        print(item.name)
        
#サブフォルダ取得
    #方法１
    for entry in os.listdir(basepath):
        if os.path.isdir(os.path.join(basepath, entry)):
            print(entry)
    #方法2　
    with os.scandir(basepath) as entries:
        for entry in entries:
            if entry.is_dir():
                print(entry.name)
    #方法3
    for entry in basepath.iterdir():
        if entry.is_dir():
            print(entry.name)
     
#ファイルの編集時刻取得
    #方法１
    with os.scandir('my_directory') as entries:
        for entry in entries:
            info = entry.stat()
            print(info.st_mtime)
    #方法２
    for entry in basepath.iterdir():
        info = entry.stat()
        print(info.st_mtime)
        
    #※ 時刻変換関係
    timestamp = int(info.st_mtime)#ms秒を削除
    dt = datetime.datetime.utcfromtimestamp(info.st_mtime) #st_mtime→datetimeに
    dt = dt.strftime('%Y-%m-%d %H:%M:%S')
    #https://strftime.org/
    #https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
    
#フォルダーの存在確認
    os.path.exists('directory')
#フォルダ作成
    #方法１
    try:
        os.mkdir('directory')
    except FileExistsError as e:
        print(e)
    #方法2
    p = Path('directory')
    try:
        p.mkdir()
    except FileExistsError as e:
        print(e)
    #※エラー無視時,
    p.mkdir(exist_ok=True)
    #※サブフォルダー作成
    os.makedirs('floder/subf/sub')

#一時ファイルの作成
    from tempfile import  TemporaryFile
    # 一時ファイル作成＆データ入力
    fp = TemporaryFile('w+t')
    fp.write('Hello World!')
    # データ読み込み
    fp.seek(0)
    data = fp.read()
    print(data)
    # ファイルを閉じる（自動削除）
    fp.close()
    
    #with バージョン
    with TemporaryFile('w+t') as fp:
        fp.write('i am good man!')
        fp.seek(0)
        fp.read()     
#一時フォルダの作成
    import tempfile
    with tempfile.TemporaryDirectory() as tmpdir:
        print('Created temporary directory ', tmpdir)
        print(os.path.exists(tmpdir))
#ファイル削除
    os.remove(file)
    #or
    os.unlink(file)
#フォルダの削除
    os.rmdir(dir)
    #or
    dir = Path('my_documents/bad_dir')
    dir.rmdir()
#フォルダーツリーの削除
    shutil.rmtree(dir_tree)
#ファイルコピー
    shutil.copy(src, dst)
    #or
    shutil.copy2(src, dst)#ファイルのプロパティもコピー 
#フォルダーツリーのコピー
    dst = shutil.copytree('data', 'databackup')
#ファイルおよびフォルダーの移動
    dst = shutil.move('dir/', 'backup/')
#ファイルおよびフォルダーのリネーム 
    os.rename('first.zip', 'first_01.zip')
    
#.txt ファイル探し
    #Strings and Character Data in Python
    #https://realpython.com/python-strings/
    #方法１
    for f_name in os.listdir('directory'):
        if f_name.endswith('.txt'):
            print(f_name)
    #方法2     
    import fnmatch
    for f_name in os.listdir('directory'):
        if fnmatch.fnmatch(f_name, 'data_*_2020*.txt'):
            print(f_name)
    #方法3
    import glob
    for name in glob.glob('*/*/*[0-9]*.txt'):#サブフォルダ、0～9の文字を含むの.txtファイルを探し
        print(name)
        
#zipファイルの読み込み
    import zipfile
    with zipfile.ZipFile('data.zip', 'r') as zipobj:
        for names in zipobj.namelist():
            if os.path.isfile(names)
                info = zipobj.getinfo(names)
                print(info.file_size,bar_info.date_time,bar_info.filename)

#zipファイルから指定ファイルの解凍
    data_zip = zipfile.ZipFile('data.zip', 'r')
    #data.zipの中のfile1.pyを作業ディレクトリへ解凍
    data_zip.extract('file1.py')
    #全てを指定フォルダーへ解凍
    data_zip.extractall(path='extract_dir/')
    #パスワードある場合
    data_zip.extractall(path='extract_dir', pwd='password')
    data_zip.close()

#zipファイルの作成＆追加
    #作成
    file_list = ['file1.py', 'sub_dir/', 'sub_dir/bar.py', 'sub_dir/foo.py']
    with zipfile.ZipFile('new.zip', 'w') as new_zip:
        for name in file_list:
            new_zip.write(name)
    #追加
    with zipfile.ZipFile('new.zip', 'a') as new_zip:
        new_zip.write('data.txt')
        new_zip.write('latin.txt')

#tarファイルの読み込み
    import tarfile
    with tarfile.open('example.tar', 'r') as tar_file:
        #mode :['r','r:gz','r:bz2','w','w:gz','w:xz','a']
        for entry in tar_file.getmembers():
            print(entry.name)
            print(' Modified:', time.ctime(entry.mtime))
            print(' Size    :', entry.size, 'bytes')
        #or
        f = tar_file.extractfile('app.py')
        f.read()

#tarファイルから指定ファイルの解凍
    tar = tarfile.open('example.tar', mode='r')
    #カレントディレクトリに解凍
    tar.extract('README.md')
    #全てを指定フォルダーへ解凍
    tar.extractall(path="extracted/")
    
#tarファイルの作成＆追加
    #作成
    import tarfile
    file_list = ['app.py', 'config.py', 'CONTRIBUTORS.md', 'tests.py']
    with tarfile.open('packages.tar', mode='w') as tar:
        for file in file_list:
            tar.add(file)
    #追加
    with tarfile.open('package.tar', mode='a') as tar:
        tar.add('foo.bar')
    #確認
    with tarfile.open('package.tar', mode='r') as tar:
        for member in tar.getmembers():
            print(member.name)
            
#shutil.make_archive()でフォルダー圧縮
    import shutil
    #dataフォルダーしたのファイルをbackup.tarに圧縮
    shutil.make_archive('data/backup', 'tar', 'data/')
    #解凍
    shutil.unpack_archive('backup.tar', 'extract_dir/')
    
#複数ファイルの読み込み
    #https://docs.python.org/3/library/fileinput.html
    import fileinput,sys
    for line in fileinput.input():
        if fileinput.isfirstline():
            print(f'\n--- Reading {fileinput.filename()} ---')
        print(' -> ' + line, end='')
```
[非IT業種のITメモ](https://qiita.com/ousrok/items/135734b5f66afb497253)