この記事では、Pythonのosモジュールについて、基本からしっかり解説していきます。
Pythonを使ってファイルやフォルダを扱いたいな、と思ったときに必ずと言っていいほどお世話になるのがosモジュールなんです。
なんだか難しそう?いえいえ、大丈夫!この記事を読めば、osモジュールの使い方がバッチリわかりますよ。
この記事で学べること
- osモジュールが一体何者なのか
- ファイルやフォルダの基本的な操作方法(作成、削除、名前変更、一覧表示など)
- ちょっとややこしいパスの扱い方
- 環境変数の読み取り方
- 使う上での注意点や、よくあるエラーの対処法
- (おまけ) pathlibモジュールとの簡単な比較
Pythonのosモジュールとはそもそも何?
まず、Pythonのosモジュールって一体何者なんでしょう?
簡単に言うと、Pythonプログラムの中から、パソコンの基本的な機能(OSの機能)を呼び出すための命令セットみたいなものです。
OSっていうのは、WindowsとかmacOSとかLinuxとか、皆さんが普段使っているパソコンを動かすための基本ソフトウェアのことですね。ファイルを作ったり、フォルダを開いたり、そういうパソコンの基本的な操作は、実は全部OSがやってくれています。
osモジュールを使うと、Pythonのプログラムを通じて、OSに「このファイル作って!」とか「このフォルダの中身を見せて!」みたいなお願いができるようになるんです。だから名前がosモジュールなんですね。すごく便利そうじゃないですか?
Pythonのosモジュールを使うための準備 - import os
osモジュールはPythonにもともと入っている標準ライブラリなので、追加で何かをインストールする必要はありません。ラッキー!
ただし、使う前には「これからosモジュールを使いますよー」という宣言が必要です。
Pythonファイルの最初に、次の一行を書くだけでOK。
import os
これだけで、osモジュールが持つ様々な機能を使えるようになります。Pythonでは、こうやって使う機能を`import`文で宣言するのがお約束なんです。
osモジュール主要機能① ファイル操作の基本
さあ、いよいよ具体的な機能を見ていきましょう!まずは基本中の基本、ファイル操作です。
- ファイルの存在確認 `os.path.exists()`
指定したファイルやフォルダが本当にそこにあるかを確認します。処理をする前に確認しておくと安全ですね。
書き方: `os.path.exists('ファイル名やフォルダ名')` → ある場合はTrue、ない場合はFalseが返ってきます。 - ファイル削除 `os.remove()`
ファイルを削除します。ゴミ箱には入らず完全に消えるので、使うときは慎重に!
書き方: `os.remove('削除したいファイル名')` - ファイル名変更 `os.rename()`
ファイルの名前を変更します。フォルダ名の変更にも使えます。
書き方: `os.rename('元のファイル名', '新しいファイル名')` - ファイル作成
実はosモジュール自体には「空のファイルを作る」専用の命令はちょっと扱いにくいものが多いです。Python標準の`open()`関数と組み合わせるのが一般的です。`open('新しいファイル名', 'w').close()`のように書くと、空のファイルが作れます。
実際にコードを見てみましょう。
ファイルを作成して削除する
ここでは、`open()`で空のテキストファイル`sample.txt`を作成し、本当に存在するか確認してから`os.remove()`で削除する、という一連の流れを試してみます。
import os # 作成するファイル名 file_name = 'sample.txt' # --- ファイル作成 --- print(f'{file_name} を作成します。') # 'w'モードで開くと、ファイルがなければ新規作成される with open(file_name, 'w') as f: # 特に書き込まないのでpass pass print(f'{file_name} を作成しました。') # --- ファイル存在確認 --- if os.path.exists(file_name): print(f'{file_name} が存在します。') else: print(f'{file_name} が見つかりません。') # --- ファイル削除 --- print(f'{file_name} を削除します。') # 存在するファイルのみ削除(念のため) if os.path.exists(file_name): os.remove(file_name) print(f'{file_name} を削除しました。') else: print(f'{file_name} は既に削除されているか、存在しません。') # --- 再度、ファイル存在確認 --- if os.path.exists(file_name): print(f'{file_name} がまだ存在します。') else: print(f'{file_name} は見つかりません。(削除成功!)')
このコードを実行すると、実行した場所に`sample.txt`が一瞬作られて、すぐに削除されるはずです。コンソールの出力で流れを確認してみてくださいね。
# 実行結果の例 sample.txt を作成します。 sample.txt を作成しました。 sample.txt が存在します。 sample.txt を削除します。 sample.txt を削除しました。 sample.txt は見つかりません。(削除成功!)
osモジュール主要機能② ディレクトリ操作の基本
ファイルだけでなく、フォルダ(Pythonの世界ではディレクトリと呼びます)の操作もosモジュールの得意分野です。
- カレントディレクトリ取得 `os.getcwd()`
今、プログラムが実行されている場所(カレントディレクトリ)のパスを取得します。`cwd`はCurrent Working Directoryの略です。
書き方: `os.getcwd()` - ディレクトリ作成 `os.makedirs()`
新しいディレクトリを作成します。深い階層のディレクトリ(例: `folderA/folderB`)も一気に作ってくれる優れものです。
書き方: `os.makedirs('作りたいディレクトリ名')` - ディレクトリ削除 `os.rmdir()`, `os.removedirs()`
`os.rmdir()`は空のディレクトリを削除します。中身が入っているとエラーになります。
`os.removedirs()`は指定したディレクトリから親ディレクトリをたどって、空になったディレクトリを可能な限り削除します。
書き方: `os.rmdir('削除したい空のディレクトリ名')`, `os.removedirs('削除したいディレクトリ名')` - ディレクトリ内一覧取得 `os.listdir()`
指定したディレクトリの中にあるファイルやディレクトリの名前をリスト形式で取得します。
書き方: `os.listdir('中身を見たいディレクトリ名')` (引数を省略するとカレントディレクトリが対象になります) - カレントディレクトリ変更 `os.chdir()`
プログラムが作業する場所(カレントディレクトリ)を変更します。
書き方: `os.chdir('移動したいディレクトリのパス')`
新しいフォルダを作りファイル一覧を表示する
ここでは、`my_new_folder`という名前の新しいフォルダを作成し、そのフォルダがちゃんと作られたか(カレントディレクトリの一覧に含まれるか)を確認してみましょう。
import os # 作成するフォルダ名 folder_name = 'my_new_folder' # --- 現在のディレクトリを確認 --- current_dir = os.getcwd() print(f'現在のディレクトリ: {current_dir}') # --- ディレクトリ作成 --- print(f'{folder_name} を作成します。') # 既に存在する場合はエラーになるのを避けるため、存在しない場合のみ作成 if not os.path.exists(folder_name): os.makedirs(folder_name) print(f'{folder_name} を作成しました。') else: print(f'{folder_name} は既に存在します。') # --- カレントディレクトリの中身を確認 --- print('カレントディレクトリの中身:') file_list = os.listdir('.') # '.' はカレントディレクトリを意味します for item in file_list: print(f'- {item}') # --- 後片付け(作成したフォルダを削除) --- print(f'{folder_name} を削除します。') if os.path.exists(folder_name): # 中身が空のはずなのでrmdirで削除 os.rmdir(folder_name) print(f'{folder_name} を削除しました。')
これを実行すると、まず現在のディレクトリが表示され、次に`my_new_folder`が作成され、最後にカレントディレクトリの一覧が表示されるはずです。
一覧の中に`my_new_folder`が含まれていることを確認しましょう。最後にフォルダは削除しています。
# 実行結果の例 (実行場所によって中身は異なります) 現在のディレクトリ: C:\Users\YourUser\Documents\PythonScripts my_new_folder を作成します。 my_new_folder を作成しました。 カレントディレクトリの中身: - my_new_folder - main.py - other_file.txt my_new_folder を削除します。 my_new_folder を削除しました。
osモジュール主要機能③ パス操作をマスターしよう
ファイルやディレクトリを扱う上で、避けて通れないのがパスの扱いです。
パスというのは、ファイルやディレクトリがパソコンのどこにあるかを示す住所のようなもの(例: `C:\Users\YourUser\Documents\file.txt` や `/home/user/data/image.jpg`)。
でも、パスの書き方はOSによって微妙に違います。Windowsは円マーク(`\`)、macOSやLinuxはスラッシュ(`/`)を使いますよね。
これをプログラムで吸収してくれるのが`os.path`サブモジュールです!これを使えば、OSの違いをあまり気にせずにコードが書けます。
- パスの結合 `os.path.join()`
ディレクトリ名とファイル名をくっつけて、OSに合った正しい形式のパスを作ってくれます。文字列の`+`で連結するより、絶対こちらを使うべき!
書き方: `os.path.join('ディレクトリ名', 'サブディレクトリ名', 'ファイル名')` - パスの分割 `os.path.split()`
パスをディレクトリ部分とファイル(または最後のディレクトリ)部分に分割します。
書き方: `os.path.split('パス文字列')` → `('ディレクトリ部分', 'ファイル名部分')` というタプルが返ります。 - 拡張子の取得 `os.path.splitext()`
ファイル名とその拡張子を分割します。
書き方: `os.path.splitext('ファイル名パス')` → `('ファイル名本体', '.拡張子')` というタプルが返ります。 - 絶対パスの取得 `os.path.abspath()`
相対パス(例: `data/file.txt`)から、絶対パス(例: `/home/user/project/data/file.txt`)を取得します。
書き方: `os.path.abspath('相対パスなど')`
`os.path.join()`は特によく使うので覚えておきましょう!
import os # 例:カレントディレクトリにある'data'フォルダの中の'result.csv'というパスを作る dir_name = 'data' file_name = 'result.csv' # os.path.joinを使う (推奨!) correct_path = os.path.join(os.getcwd(), dir_name, file_name) print(f'os.path.joinで作成: {correct_path}') # 参考:単純に文字列連結した場合(OSによっては問題が出るかも) # manual_path = os.getcwd() + '\\' + dir_name + '\\' + file_name # Windowsの場合 # manual_path = os.getcwd() + '/' + dir_name + '/' + file_name # macOS/Linuxの場合 # print(f'手動で連結(非推奨): {manual_path}') # パスの分割 path_to_split = correct_path dir_part, file_part = os.path.split(path_to_split) print(f'分割結果 - ディレクトリ部: {dir_part}') print(f'分割結果 - ファイル名部: {file_part}') # 拡張子の取得 base_name, extension = os.path.splitext(file_part) print(f'拡張子取得 - ファイル名本体: {base_name}') print(f'拡張子取得 - 拡張子: {extension}')
osモジュール主要機能④ 環境変数を扱う
環境変数って聞いたことありますか?OSが持っている設定値みたいなもので、プログラムの動作に必要な情報(例えば、設定ファイルの場所や、外部のサービスの接続情報など)を保持するためによく使われます。
osモジュールを使えば、Pythonプログラムから環境変数を読み取ることができます。
- 特定の環境変数を取得 `os.environ.get()` または `os.getenv()`
指定した名前の環境変数の値を取得します。値が見つからない場合に、エラーを出さずに`None`(または指定したデフォルト値)を返してくれる`get()`や`getenv()`を使うのが安全です。
書き方: `os.environ.get('環境変数名')` または `os.getenv('環境変数名')` - すべての環境変数を取得 `os.environ`
すべての環境変数を辞書(キーと値のペア)として取得します。どんな環境変数があるか一覧したいときに便利。
書き方: `os.environ`
例えば、Windowsなら`USERNAME`、macOS/Linuxなら`USER`という環境変数に、現在のユーザー名が入っていることが多いです。試してみましょう。
import os # USERNAME または USER 環境変数を取得してみる # os.environ.get() は、見つからない場合に None を返す username = os.environ.get('USERNAME') # Windows if username is None: username = os.environ.get('USER') # macOS / Linux if username: print(f'ユーザー名(環境変数から取得): {username}') else: print('ユーザー名の環境変数が見つかりませんでした。') # 参考:PATH環境変数(プログラムを探す場所のリスト)を取得 path_var = os.getenv('PATH') if path_var: print('\nPATH環境変数の一部:') # 長いので最初の100文字だけ表示 print(path_var[:100] + '...') else: print('PATH環境変数が見つかりませんでした。') # 参考:すべての環境変数を表示(たくさん表示されます!) # print('\nすべての環境変数:') # for key, value in os.environ.items(): # print(f'{key} = {value}')
APIキーのような秘密にしておきたい情報を、コードに直接書かずに環境変数から読み込む、といった使い方がよくされます。
osモジュールを使う上での注意点とエラー対策
便利なosモジュールですが、いくつか注意点があります。これを知らないと、予期せぬエラーに悩まされることも…
- 存在しないファイル/ディレクトリへの操作
`os.remove()`しようとしたファイルが存在しない、`os.chdir()`しようとしたディレクトリがない、といった場合、エラー(`FileNotFoundError`など)が発生してプログラムが止まってしまいます。操作する前に`os.path.exists()`で存在確認をするのが基本です。 - アクセス権限の問題
プログラムを実行しているユーザーに、そのファイルやディレクトリを操作する権限がない場合もエラー(`PermissionError`)になります。特にシステム関連のフォルダなどを操作しようとすると起こりがちです。 - パスの指定ミス
特にWindowsで注意が必要なのが、パス区切り文字の`\`(円マーク)です。Pythonの文字列中では`\`は特殊文字(エスケープ文字)として扱われるため、パスとして書くときは`\\`と重ねるか、文字列の前に`r`を付けてraw文字列(例: `r'C:\Users\...'`)として扱う必要があります。でも、前述の`os.path.join()`を使えば気にしなくて良いので楽ちんですね! - ディレクトリ削除の注意
`os.rmdir()`は空のディレクトリしか削除できません。中にファイルが残っていると`OSError`になります。中身ごと消したい場合は、まず中のファイルをすべて削除してから`os.rmdir()`するか、別のモジュール(`shutil`モジュールなど)を使う必要があります。
エラーが起きそうな箇所は、Pythonの`try-except`構文を使って、エラーが発生してもプログラムが止まらないように対処(エラーハンドリング)するのが一般的です。
import os file_to_remove = '絶対に存在しないファイル名.xyz' # 存在確認せずに削除しようとすると... try: os.remove(file_to_remove) print('ファイル削除成功(ここは通らないはず)') except FileNotFoundError: print(f'エラーキャッチ!: {file_to_remove} が見つかりませんでした。') # 存在確認してから削除する(安全な方法) if os.path.exists(file_to_remove): try: os.remove(file_to_remove) print('ファイル削除成功') except OSError as e: print(f'削除中にエラーが発生しました: {e}') else: print(f'{file_to_remove} は最初から存在しません。')
エラーを恐れず、まずは`os.path.exists()`で確認する癖をつけると、だいぶエラーを減らせますよ!
osモジュールと何が違う?pathlibモジュールとの比較
最近のPython(3.4以降)では、`os.path`モジュールの機能をもっと使いやすく、オブジェクト指向的にした`pathlib`というモジュールが登場し、利用が推奨されています。
簡単に言うと、`os.path`が文字列に対して関数を呼び出すスタイル(例: `os.path.join(dir, file)`)なのに対し、`pathlib`はパス自体をオブジェクトとして扱い、そのオブジェクトのメソッドを呼び出すスタイル(例: `path_obj / file` のように `/` 演算子で結合できる)になります。
import os from pathlib import Path # pathlibを使うにはimportが必要 dir_name = 'my_dir' file_name = 'my_file.txt' # --- os.path を使った場合 --- os_path = os.path.join(os.getcwd(), dir_name, file_name) print(f'os.path: {os_path}') print(f'os.path ファイルが存在するか: {os.path.exists(os_path)}') # --- pathlib を使った場合 --- # Pathオブジェクトを作成 current_path_obj = Path.cwd() # os.getcwd() と同じ path_obj = current_path_obj / dir_name / file_name # / で結合できる! print(f'pathlib: {path_obj}') # 文字列としても扱える print(f'pathlib ファイルが存在するか: {path_obj.exists()}') # オブジェクトのメソッドを使う
どうでしょう?`pathlib`の方が直感的でコードがスッキリ見えるかもしれませんね。
新しいコードを書くなら`pathlib`を検討する価値は十分にありますが、`os`モジュールもまだまだ現役で、特にファイル/ディレクトリ操作以外のOS機能(プロセス管理など)も含まれているため、両方の基本を知っておくと非常に役立ちます。
【まとめ】Pythonのosモジュールでできることを再確認
Pythonのosモジュールについて、基本的なところを見てきましたね。
この記事で学んだ主な内容を振り返ってみましょう。
- osモジュールとは OSの機能を使うための命令セット
- ファイル操作 存在確認(`exists`)、削除(`remove`)、名前変更(`rename`)など
- ディレクトリ操作 作成(`makedirs`)、削除(`rmdir`)、一覧取得(`listdir`)、場所移動(`chdir`)など
- パス操作 OS間の違いを吸収する結合(`join`)、分割(`split`)、拡張子取得(`splitext`)など
- 環境変数 読み取り(`getenv`, `environ`)
- 注意点 存在確認、権限、パス指定、エラーハンドリング
- pathlibとの比較 より新しいオブジェクト指向の方法
osモジュールを使いこなせるようになると、Pythonでできることの幅がぐっと広がります。
面倒なファイル整理や定型作業を自動化して、もっとクリエイティブなことに時間を使えるようになるかもしれません!
【関連記事】 「Pythonとは?」に答える最初の一歩
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。