Pythonプロジェクト:フォルダ内のファイルをファイルタイプ別に整理してみた

Table of Contents

Table of Contents

Development Environment

  • MacOS 11.2
$ python --version
Python 3.9.0

$ pyenv --version
pyenv 1.2.27

Goal

下記のようなファイル構成をフォルダ内のファイルをファイルタイプ別に整理してみる。

files/
  - txt1.txt
  - csv1.csv
  - txt2.txt
  - csv2.csv
  - txt3.txt
  - csv3.csv
  - txt4.txt
  - csv4.csv
  - txt5.txt
  - csv5.csv

期待する結果はこんな感じです。

reorganization/
  - txt/
    - txt1.txt
    - txt2.txt
    - txt3.txt
    - txt4.txt
    - txt5.txt
  - csv/
    - csv1.csv
    - csv2.csv
    - csv3.csv
    - csv4.csv
    - csv5.csv

Let's Start

Workflow

  • 結果を保存するため、「reorganization」という空のフォルダを作成する。
  • Loopで「files」フォルダ内のファイルを処理する。
  • Loop処理内は、ファイルのタイプを取得して、ファイルをそのタイプ用のフォルダの配下にコピーを作成する。もし、タイプ用のフォルダがなければ作成する。

Code

import os
import shutil

try:
    path = "./reorganization"
    if not(os.path.isdir(path)):
        os.mkdir(path)
    list = os.listdir("./files")
    for index, value in enumerate(list):
        (name, ext) = os.path.splitext(value)
        type_folder_path = f"{path}/{ext[1:]}"
        if not(os.path.isdir(type_folder_path)):
            os.mkdir(type_folder_path)
        shutil.copyfile(f"./files/{value}", f"{type_folder_path}/{value}")
        
except OSError:
    print (f"Failed" )
else:
    print (f"Success")

Module

  • os: フォルダの確認と作成、フォルダ内のファイルリストの取得。
  • shutil: ファイルのコピー。

フォルダの確認と作成

os.path.isdir()関数でフォルダが存在しているかを確認する。

path = "./reorganization"
if not(os.path.isdir(path)):
    os.mkdir(path)

Loop処理

os.listdir()関数でフォルダ内のファイルリストを取得する。

list = os.listdir("./files")
    for index, value in enumerate(list):
        #...

ファイルのタイプを取得して、目標パスにコピーを作成する

os.path.splitext()関数でファイルタイプを取得する。
shutil.copyfile()関数で目標パスにコピーを作成する。

for index, value in enumerate(list):
    (name, ext) = os.path.splitext(value)
    type_folder_path = f"{path}/{ext[1:]}"
    if not(os.path.isdir(type_folder_path)):
        os.mkdir(type_folder_path)
    shutil.copyfile(f"./files/{value}", f"{type_folder_path}/{value}")

Summary

  • os.path.isdir()関数でフォルダが存在しているかを確認する。
  • os.listdir()関数でフォルダ内のファイルリストを取得する。
  • os.path.splitext()関数でファイルタイプを取得する。
  • shutil.copyfile()関数で目標パスにコピーを作成する。