【Python】標準ライブラリ OS を使ったフォルダ・ファイル操作

みなさんこんにちは、ZeroTerasu(@ZeroTerasu)です。

今回は、Pythonに標準装備されているライブラリである”OS”ライブラリについて解説致します。

“OS”ライブラリは、その名の通りOSに関する操作を可能にするライブラリですが、具体的には、「現在操作しているファイルのパスを示す。」、「フォルダを作成する。」、「ファイル名を変更する。」等の操作が可能になります。

また、OSライブラリはPythonの標準ライブラリ(元から組み込まれているライブラリ)ですので、installは不要で、importから使用することが出来ます。

尚、本記事では簡単のために、「フォルダ=ディレクトリ」として記述します。

ライブラリの呼び出し:import os

上述の通り、osは組み込みライブラリのため、osを使用するためには、installは不要であり、importから始めることになります。

import os

現在の作業フォルダのパスを確認:os.getcwd()

現在作業中(操作中)のフォルダのパスを確認するためには、「os.getcwd()」メソッドを使用します。

※cwd = current working directory (現在作業中のディレクトリ(フォルダ))

os.getcwd()
# 実行結果
'c:\\Users\\username\\directoryname'

現在の作業フォルダのパスを確認:!pwd

・os.getcwd()の補足になりますが、”!pwd”でも作業中ディレクトリを表示することが出来ます。

・但し、これはLinuxコマンドになりますので、Windowsでは正常に表示されません。(文字化けします。)

・現在のフォルダ名を使った操作を展開する場合は、os.getcwd()を使用するようにして下さい。

※pwd = print working directory

!pwd
# 実行結果
/Users/username/directoryname # MACの場合
'pwd' 文字化け #windowsの場合

ファイルの削除:os.remove(ファイルパス)

・ファイルの削除には、「os.remove()」メソッドを使用します。

・引数には、ファイルパスを使用しますので、ファイル拡張子を含めたファイル名まで記述が必要です。

filePass = 'C:/Users/username/sample.txt' # 区切りにバックスラッシュ(\)が使用されているとエラーとなるので注意。
os.remove(filepass)
# 実行結果
対象のファイルが削除されます。

ファイル名変更:os.rename(‘変更前のファイルパス’, ‘変更後のファイルパス’)

ファイル名変更は、ファイル名変更前のファイルパスとファイル名変更後のファイルパスを引数に渡してos.rename()メソッドを実行します。

oldFilePass = 'C:/Users/username/oldsample.txt' # 区切りにバックスラッシュ(\)が使用されているとエラーとなるので注意。
newFilePass = '/'.join(oldFilePass.split('/')[0:3])+'/newsample.txt' # 下記にてコード解説
os.rename(oldFilePass, newFilePass)
# 実行結果
ファイル名変更:oldsample.txt -> newsample.txt

# コード解説
'/'.join([要素1, 要素2, 要素3, ... ]) -> '要素1/要素2/要素3/...' 
↑ 
join()メソッドは、リストの各要素を直前の文字列を繋ぎに使って結合します。

'文字列1/文字列2/文字列3/...'.split('/') -> ['文字列1', '文字列2', '文字列3', ... ]
↑ 
split()メソッドは、文字列を引数に指定した文字列で分割してリストとして返します。

['文字列1', '文字列2', '文字列3', ... ][0:3] -> ['文字列1', '文字列2']
↑
[start:stop] リストのスライスでは、インデックス番号を指定することで、start ~ stop-1 のインデックス番号を持った要素を抽出します。

# 追記
下記のコードの方がシンプルで分かりやすい様子です。
newFilePass = os.path.split(oldFilePass)[0]+'/newsample.txt'

ディレクトリの作成:os.mkdir(フォルダパス*) *ディレクトリ名のみ記述=現在の作業ディレクトリに新規ディレクトリが作成される。

・新規ディレクトリ作成には、「os.mkdir()」メソッドを使います。

・引数には、①新規ディレクトリ名のみ指定 または ②新規ディレクトリのフルパス を記述します。

・ディレクトリパスでは、相対パスも使用可能です。

# os.getcwd() -> 'C:/Users/username'こちらを現在の作業ディレクトリとして以下コード解説致します。

# 1. 現在の作業ディレクトリに新規ディレクトリを作成
os.mkdir('newDir')
# 処理結果
'C:/Users/username/newDir'

# 2-1. 新規ディレクトリのフルパスを記述してディレクトリを作成
newDirPass = 'C:/Users/username/newDir2'
os.mkdir(newDirPass)
# 処理結果
'C:/Users/username/newDir2'

# 2-2. 新規ディレクトリの相対パスを記述してディレクトリを作成
# Usersディレクトリに「newUser」というディレクトリを作成します。
os.mkdir('../newUser')
# 処理結果
'C:/Users/newUser

ディレクトリの削除:os.rmdir(フォルダパス*) *ディレクトリ名のみ記述=現在の作業ディレクトリ内に該当フォルダが存在する場合削除されます。

・ディレクトリの削除には、「os.rmdir()」メソッドを使用します。

・ローカル環境ではしばしば「アクセスが拒否されました。」というエラーが発生するため、手動で削除した方が早いと思われます。

# os.getcwd() -> 'C:/Users/username'こちらを現在の作業ディレクトリとして以下コード解説致します。

# 1. 現在の作業ディレクトリのフォルダを削除
os.rmdir('newDir')
# 処理結果
'C:/Users/username'

# 2. 対象のディレクトリのフルパスを記述してディレクトリを削除
newDirPass = 'C:/Users/username/newDir2'
os.rmdir(newDirPass)
# 処理結果
'C:/Users/username'

(参考)現在のファイルパス:pathlib.Path(パス).glob(ワイルドカード)*jupyter notebook または ipynb環境についての記事になります。

・この記事は、jupyter notebook または ipynb環境についての参考記事になります。これらの環境では、自身のファイルパスを取得するためには工夫が必要ですので参考記事として記述しました。

・通常のPythonファイル(.py)では、「__file__」のコードで現在のファイルパスが簡単に取得できます。

・jupyterlab または ipynbファイルには、自身のファイルパスを呼び出す方法がありません。通常のPythonファイルであれば、上述の通り「__file__」によって実行中ファイルのパスを取得することが出来ますが、ipynbでは不可です。

import os
import pathlib
import glob

fileList = pathlib.Path(os.getcwd())
for i in fileList.glob('*'): # ここでは、*として全てのファイルを取得できるようにしていますが、ファイル名を指定すれば任意のファイルのパスが取得できます。
    print(i)

os.path()の使い方

・osライブラリの基本操作は上述の通りですが、このライブラリで実用的に使用される頻度が最も高いメソッドは、下記の「os.path()」メソッドだと思います。ここでは、os.path()の中でも使用頻度が高いと思われる下記4つのメソッドを紹介いたします。

basename(ディレクトリパス/ファイル名) -> ファイル名

basename()は、引数に渡されたパスのファイル名を返します。

dirname(ディレクトリパス/ファイル名) -> ディレクトリパス

dirname()は、引数に渡されたパスからファイル名を除いた部分を返します。

split(ディレクトリパス/ファイル名) -> (ディレクトリパス, ファイル名)

split()は、引数に渡されたパスのファイル名と、それまでのパスを返します。

join(ディレクトリパス, ファイル名) -> ディレクトリパス/ファイル名

join()は、パスとファイル名を結合させる事ができます。

import os
import pathlib
import glob

fileList = pathlib.Path(os.getcwd()).glob('*')
for i in fileList:
    print('basenameメソッド '+os.path.basename(i))
    print('dirnameメソッド '+os.path.dirname(i))
    print('splitメソッド ') 
    print(os.path.split(i))
    print('joinメソッド '+os.path.join(os.path.split(i)[0],os.path.split(i)[1]))

# 実行結果
basenameメソッド sample.ipynb
dirnameメソッド c:\Users\username\pathsample
splitメソッド ('c:\\Users\\username\\pathsample', 'sample.ipynb')
joinメソッド c:\Users\username\pathsample\sample.ipynb

コメント

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