LoginSignup
4
8

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-27
#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
    #方法1
    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']

    #方法2 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)

#ファイル判断
    #方法1
    for entry in os.listdir(basepath):
        if os.path.isfile(os.path.join(base_path, entry)):
            print(entry)
    #方法2 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)

#サブフォルダ取得
    #方法1
    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)

#ファイルの編集時刻取得
    #方法1
    with os.scandir('my_directory') as entries:
        for entry in entries:
            info = entry.stat()
            print(info.st_mtime)
    #方法2
    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')
#フォルダ作成
    #方法1
    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/
    #方法1
    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メモ

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8