【Python】OSモジュールの活用!最適なファイル操作手法と自動化例の解説!

ファイル操作

こんにちは、すのくろです。

本日はPythonのOSを使ったファイル操作のよく使う関数や関数を使った自動化例を紹介していこうと思います。

-内容-

  • OSを使った基本の関数(これだけ知っておけばとりあえずOK!)
  • 自動化・効率化の例①:フォルダ内のファイルの一括リネーム
  • 自動化・効率化の例②:フォルダ内の指定のファイル同士を結合

この方法を覚えれば、データ分析の際に、ファイルやフォルダの作成やファイル名の読み込みなどを手動で行う手間を省き、効率的かつ正確にデータをまとめて処理して行けるようになると思います!

それではやっていきましょう!

OSモジュールとは?

まず初めに簡単にOSモジュールについて説明します。

Pythonをインストールしたときについてくる標準ライブラリに入っているモジュールです。

なので、プログラムで「import os」と書くだけで使えます。

import os

続いて、OSモジュールでよく使うものについて紹介していきます。

基本的には今回使うものだけ覚えていただければ、大体問題ないかと思います。

os.getcwd関数:カレントディレクトリ取得

os.getcwd関数でカレントディレクトリ(現在使っているプログラムがあるフォルダ内)を取得します。

os.getcwd()

###出力例####
'/Users/Username/Documents/folder1/folder1-1'

こんな感じでディレクトリの文字列を取得できます。

ディレクトリを取得することで後の関数と組み合わせてファイルやフォルダを操作したりできます。

os.listdir関数:フォルダの中身をリスト化

os.listdir関数は、フォルダの中身をリスト化して、指定フォルダにどんな名前のファイルやフォルダが入っているか取得できます。

# os.listdir関数:フォルダの中身をリスト化

cwd = os.getcwd()
os.listdir(cwd)

###出力例###
[ 'ファイル1.xlsx',
 'ファイル2.xlsx',
 'File.ipynb',
 'data']

先ほど紹介したos.getcwd()で現在のディレクトリを変数「cwd」に入れます。

そのcwdを指定して、os.listdir()を使って、現在のディレクトリ内になる全ファイル、フォルダ名を取得しています。

このリストからファイル名を取得して読み込んだり書き込んだりすることができるようになります。

os.makedirs関数:フォルダの新規作成

os.makedirs関数でフォルダの新規作成を行います。

# 新しいフォルダの作成
os.makedirs("new_folder")

# フォルダが作成できているか確認
os.listdir(cwd)

###出力例###
[ 'ファイル1.xlsx',
 'ファイル2.xlsx',
 'File.ipynb',
 'data',
'new_folder' ] 

注意点として、作成しようとしている場所に同じフォルダ名が既に存在していると、エラーが出ます。

os.rename関数:名前の変更

os.rename関数でファイルやフォルダの名前を変更できます。

os.rename(A, B)

A: 変更対象の名前、 B: 変更後の名前

before = "new_folder"
after = "new_folder2"
os.rename(before, after)

os.listdir(cwd)

###出力例###
[ 'ファイル1.xlsx',
 'ファイル2.xlsx',
 'File.ipynb',
 'data',
'new_folder2' ] 

os.remove関数:削除

s.remove関数でファイルを削除できます。

削除できるのはファイルのみで、フォルダの削除はできません。

file_name = "OOOOO"
os.remove(file_name)

os.rmdir関数:空のフォルダ削除

空のフォルダを削除することができます。

folder_name = "OOOOO"
os.rmdir(folder_name)

os.walk関数:ディレクトリツリー取得

os.walk関数を使って、ディレクトリツリー(フォルダの階層)を取得できます。

これによってフォルダ内の深い階層まで入り込んで、フォルダ内のファイルを全てとってくることもできます。

# os.walk関数:ディレクトリツリー取得

cwd = os.getcwd()

os.walk(cwd)

##
<generator object _walk at 0x7fbec069fa50>

ただしos.walk()はただのジェネレータというもので、上のように関数を打つだけでは使えなくて、for文で回してあげることでうまく中身を小出しで出力できます。

もしくは引数を指定して中身を取得していきます。

# os.walk関数:ディレクトリツリー取得

for i in os.walk(cwd):
    print(i)
    print()


###出力結果例###

('/Users/Username/Documents/000_folder/230425_エクセル結合', ['new_folder2', '.ipynb_checkpoints', 'data'], ['.DS_Store', 'ファイル名.xlsx', 'OSまとめ.ipynb', 'File_concat_CSV_RAM.ipynb'])

('/Users/Username/Documents/000_folder/230425_エクセル結合/new_folder2', [], [])

('/Users/Username/Documents/000_folder/230425_エクセル結合/.ipynb_checkpoints', [], ['OSまとめ-checkpoint.ipynb', 'File_concat_CSV_RAM-checkpoint.ipynb'])

('/Users/Username/Documents/000_ブログ/230425_エクセル結合/data', [], ['230425-2_test_data.csv', '230425-1_test_data.csv', '23test_data_230425-2.csv', '230425-st_data_230425-1.csv'])

os.pathモジュール

次に、少し応用のos.pathモジュールについて解説します。

os.path()モジュールは、

・「ファイルやディレクトリの存在確認」

・「指定したパスのファイル名の取得」

・「パスやファイル名の結合」

などの用途で使用します。

os.pathに関してもよく使う代表的なものをいくつか紹介します。

os.path.join関数

os.path.join関数はカンマ区切りのディレクトリをつなげる関数です。

folder = "folder1"
file = "file.csv"

os.path.join(folder, file)

###
'folder1/file.csv'

これで絶対パスを作成して、ファイル読み込みなどに利用したりします。

os.path.exists関数:パスの存在確認

os.path.exists関数はパスの存在確認ができます。

指定のパス(ディレクトリ)が存在するならTrue、しないならFalseを返します。

os.path.exists('/Users/Username/Documents/000_folder/new_folder2')
# True
 
os.path.exists('/Users/Username/Documents/000_folder/new_folder4')
# False

os.path.isfile関数:ファイルか確認

os.path.isfile関数は指定のパスがファイルか確認します。

ファイルだとTrue, それ以外(フォルダ等)だとFalseを返します。

os.path.isfile("/Users/Username/Documents/000_folder")
### False
 
os.path.isfile("/Users/Username/Documents/data.csv")
### True

os.path.isdir関数:フォルダか確認

os.path.isdir関数で存在するフォルダか確認します。

指定したディレクトリが存在するか確認する方法

os.path.isdir(/Users/Username/Documents/000_folder/data.csv)
### False
 
os.path.isdir(/Users/Username/Documents/000_folder")
### True

OSモジュールを応用した自動化の例

osの基本的な関数と使用方法がわかったところで、実際にどうやってosを使っていくかを簡単に紹介したいと思います。

例1: ファイルの一括リネーム

一つ目は「ファイルの一括リネーム」です。
あるディレクトリ内のファイル名を一括で変更する自動化スクリプトになります。

コードは下記です。

import os

def rename_files(directory_path, prefix):
    for filename in os.listdir(directory_path):
        if filename.startswith(prefix):
            new_filename = filename.replace(prefix, "new_")
            os.rename(os.path.join(directory_path, filename), os.path.join(directory_path, new_filename))

# ディレクトリ内のファイル名を一括で変更
rename_files('/path/to/directory', 'prefix_')

上記の例では、rename_filesという関数を定義しています。

この関数は、指定されたディレクトリ内のファイル名の先頭にある特定の接頭辞(prefix_)をすべてnew_に置換します。

実際に使用するときは、ここの「prefix」→「new」の変更箇所をアレンジしてもらえればと思います。

次に、os.listdir()関数を使ってディレクトリ内のファイルを取得し、os.rename()関数を使ってファイル名の変更を行っています。

例2: フォルダ内の指定のファイル同士を結合

二つ目の例は「フォルダ内の指定のファイル同士を結合」です。

以下は、osモジュールを利用して指定の文字が含まれるファイル名のファイルを結合するプログラムの例です。

import os

def combine_files_with_keyword(folder_path, output_file, keyword):
    with open(output_file, 'w') as output:
        for filename in os.listdir(folder_path):
            if keyword in filename:
                file_path = os.path.join(folder_path, filename)
                if os.path.isfile(file_path):
                    with open(file_path, 'r') as file:
                        content = file.read()
                        output.write(content)

# フォルダ内の指定の文字が入ったファイル名のファイルを結合
folder_path = '/path/to/folder'
output_file = '/path/to/output.csv'
keyword = '指定の文字'

combine_files_with_keyword(folder_path, output_file, keyword)

このプログラムでは、combine_files_with_keywordという関数を定義しています。

この関数は、指定のフォルダ内に存在するファイルのうち、ファイル名に指定のキーワードが含まれるファイルを結合して指定の出力ファイルに書き込みます。

プログラムの動作は以下のようになります:

  1. folder_pathで指定されたフォルダ内のファイルを順に処理します。
  2. ファイル名に指定のキーワードが含まれるかどうかを確認します。
  3. キーワードが含まれるファイルが見つかった場合、そのファイルを結合対象として処理します。
  4. os.path.join()関数を使用してファイルのパスを生成します。
  5. os.path.isfile()関数を使用してファイルかどうかをチェックします。
  6. ファイルが見つかった場合、open()関数を使用してファイルを読み込みます。
  7. ファイルの内容を取得し、出力ファイルに書き込みます。
  8. 各ファイルのデータが順番にアウトプットファイルに縦に書かれ結合されていきます

上記の例では、folder_pathに指定されたフォルダ内のファイルのうち、ファイル名にkeywordで指定された文字列が含まれるファイルが結合され、output_fileに出力されます。

必要に応じてこれらのパスとキーワードを適切に設定してください。

まとめ

今回はPythonのOSライブラリを使ったファイル操作の効率化に関して、

よく使う基本の関数、関数を用いた自動化・効率化の例2つを紹介しました。

OSライブラリを用いることで手動の部分が減らせることを実感できたかと思います。

うまく使って、仕事や研究に活用していきましょう!

OS以外にも、Pythonは自由度が高く、豊富なライブラリがまだまだ用意されているため、様々なデータ処理に応用することができます!

さらにPythonのスキルを高めて、効率的に業務を遂行したい、高度なPythonを中心としたプログラミングをより体系的に学びたいと言う方向けに、おすすめのオンラインスクールを2つ厳選して紹介していますので、こちらもよければご覧ください!

自分も一度体系的にPythonを学んだことで、一気に日々の業務や人生が変わったと感じています!

以上、ここまでお読みいただき、ありがとうございました!

コメント

タイトルとURLをコピーしました