本記事では、Pythonのos
モジュールでパスとファイルを操作する主要なコマンドの一覧と使用例について紹介します。
目次
- はじめに
- コマンド一覧
-
パスの操作
- カレントディレクトリを取得する (os.getcwd)
- カレントディレクトリを変更する (os.chdir)
- パスからディレクトリ名を取得する (os.path.dirname)
- パスからファイル名またはディレクトリ名の最後の部分を取得する (os.path.basename)
- ファイルパスから拡張子を取得する(os.path.splitext)
- 相対パスを絶対パスに変換する (os.path.abspath)
- 基準パスからの相対パスを取得する(os.path.relpath)
- パスの共通部分を取得する(os.path.commonpath)
- パスを正規化する(os.path.normpath)
- パスを結合する (os.path.join)
- パスが存在するか確認する (os.path.exists, os.path.lexists)
- パスがファイルか確認する (os.path.isfile)
- パスがディレクトリか確認する (os.path.isdir)
- パスが絶対パスかを確認する(os.path.isabs)
- 2つのパスが同じ場所を指しているかを確認する(os.path.samefile)
- パスがシンボリックリンクか確認する(os.path.islink)
- シンボリックリンクが指すパスを取得する(os.readlink)
- ディレクトリツリーを再帰的に辿りファイルとディレクトリをリストアップする(os.walk)
- ディレクトリ内のファイルとディレクトリをリストアップする(os.listdir)
- チルダ記号(~)をホームディレクトリに展開する(os.path.expanduser)
- ファイルの操作
- ファイルを削除する(os.remove, os.unlink)
- ディレクトリを作成する(os.mkdir)
- 複数階層のディレクトリを作成する(os.makedirs)
- 空のディレクトリを削除する(os.rmdir)
- ファイルやディレクトリの名前を変更する(os.rename)
- ファイルを別のファイルに置き換える(os.replace)
- ファイルのサイズを取得する(os.path.getsize)
- ファイルやディレクトリのタイムスタンプを取得する(os.path.getmtime, os.path.getatime, os.path.getctime)
- ファイルやディレクトリのメタデータを取得する(os.stat)
- シンボリックリンクを作成する(os.symlink)
- ハードリンクを作成する(os.link)
- アクセス権を変更する(os.chmod)
-
パスの操作
- まとめ
はじめに
動作確認は、以下の環境で行っております。
OS: Windows 11
Python 3.11.4
パスの区切り文字として、オペレーションシステムにより、スラッシュ(/)またはバックスラッシュ(\)が使用されます。スラッシュは主にUnix系のOSで使用され、バックスラッシュはWindowsで使用されます。本記事では、パスにバックスラッシュを使用していますが、必要に応じてスラッシュに置き換えてください。
path = '/home/user/documents' # Unixスタイル
path = 'C:\\Users\\User\\Documents' # Windowsスタイル
Pythonでバックスラッシュを使用する場合、エスケープ文字として扱われるため、バックスラッシュを2つ重ねて書く必要があります。
(例:C:\\Users\\User
)
コマンド一覧
パスの操作
カレントディレクトリを取得する (os.getcwd
)
os.getcwd
は、「現在の作業ディレクトリ(カレントディレクトリ)」を取得する関数です。
import os
path = os.getcwd()
print(path) # カレントディレクトリの絶対パス (C:\Test\Python-Snippets\Path)
出力結果はC:\Test\Python-Snippets\Path
のようにカレントディレクトリの絶対パスが出力されます。
実際の出力結果はカレントディレクトリの位置により異なります。
カレントディレクトリを変更する (os.chdir
)
os.chdir
コマンドは、Pythonのプログラム内で、カレントディレクトリを変更するための関数です。引数path
には、変更後のカレントディレクトリのパスを与えます。
import os
# カレントディレクトリをCドライブに変更する
os.chdir('C:\\')
# カレントディレクトリを表示する
print(os.getcwd()) # C:\
引数には、相対パスを使うこともできます。
import os
print(os.getcwd()) # 変更前: C:\Test\Python-Snippets\Path
os.chdir('..')
print(os.getcwd()) # 変更後: C:\Test\Python-Snippets
..
は相対パスで、カレントディレクトリの親ディレクトリを意味します。
指定されたパスが存在しない場合やディレクトリパスでない場合にはエラーが発生します。
実際の出力結果はカレントディレクトリの位置により異なります。
パスからディレクトリ名を取得する (os.path.dirname
)
os.path.dirname
は、指定されたパスからディレクトリ名を取得するための関数です。この関数を使うことで、ファイルやディレクトリのパスから親ディレクトリのパスを取得できます。引数path
にパスを指定します。
import os
# ファイルパスの場合
path = 'C:\\Users\\user\\document\\file.txt'
res = os.path.dirname(path)
print(res) # C:\Users\user\document
# ディレクトリパスで末尾に\がある場合
path = 'C:\\Users\\user\\document\\'
res = os.path.dirname(path)
print(res) # C:\Users\user\document
# ディレクトリパスで末尾に\がない場合
path = 'C:\\Users\\user\\document'
res = os.path.dirname(path)
print(res) # C:\Users\user
ディレクトリパスが入力された場合、末尾にバックスラッシュ(またはスラッシュ)があるかどうかで動作が異なる点に注意が必要です。
この関数はパスが実際に存在するかどうかは調べません。
パスからファイル名またはディレクトリ名の最後の部分を取得する (os.path.basename
)
os.path.basename
は、指定されたパスからファイル名またはディレクトリ名の最後の部分を取得するために使用される関数です。引数path
にパスを設定します。
import os
# ファイルパスの場合
path = 'C:\\Users\\user\\document\\file.txt'
res = os.path.basename(path)
print(res) # file.txt
# ディレクトリパスで末尾に\がある場合
path = 'C:\\Users\\user\\document\\'
res = os.path.basename(path)
print(res) # ''
# ディレクトリパスで末尾に\がない場合
path = 'C:\\Users\\user\\document'
res = os.path.basename(path)
print(res) # document
引数として与えられたパスの末尾にバックスラッシュ(またはスラッシュ)がある場合は、空文字列が出力されます。
これを防ぐには、末尾のスラッシュをあらかじめ取り除いておきます。末尾のスラッシュを除去するにはrstrip
メソッドを使用するのが簡単です。
import os
path = 'C:\\Users\\user\\document\\'
res = os.path.basename(path.rstrip('\\'))
print(res) # document
この関数はパスが実際に存在するかどうかは調べません。
ファイルパスから拡張子を取得する(os.path.splitext
)
os.path.splitext
は、指定したファイルパスのファイル名とその拡張子を分割して取得するための関数です。引数path
にファイルパスを指定します。戻り値はタプル形式で(ファイル名, 拡張子)
が返されます。
import os
# ファイルパスの場合
path = 'C:\\Users\\user\\document\\file.txt'
name, ext = os.path.splitext(path)
print(f"name: {name}") # C:\Users\user\document\file
print(f"ext: {ext}") # .txt
このように、パスの中の最後のドット位置でファイル名と拡張子に区切られます。archive.tar.gz
のようにドットが2つある場合には
とarchive.tar
.gz
に分けられるので注意が必要です。
隠しファイルのように最初にドットファイルがある場合には、そのドットはファイル名として扱われます。
import os
# 最初にドットが含まれる場合
path = 'C:\\Users\\user\\document\\.venv'
name, ext = os.path.splitext(path)
print(f"name: {name}") # C:\Users\user\document\.venv
print(f"ext: {ext}") # ''
最後に、ディレクトリパスを与えた場合は、拡張子は空文字''
になります。
import os
# ディレクトリの場合
path = 'C:\\Users\\user\\document\\'
name, ext = os.path.splitext(path)
print(f"name: {name}") # C:\Users\user\document\
print(f"ext: {ext}") # ''
この関数はパスが実際に存在するかどうかは調べません。
相対パスを絶対パスに変換する (os.path.abspath
)
os.path.abspath
は、指定された相対パスを絶対パスに変換するための関数です。引数path
にはパスを指定します。
import os
path = '.\\file.txt' # 相対パス
res = os.path.abspath(path)
print(res) # C:\Test\Python-Snippets\Path\file.txt
パスの末尾にバックスラッシュ(またはスラッシュ)がある場合には、そのバックスラッシュ(またはスラッシュ)は削除されます。
この関数はパスが実際に存在するかどうかは調べません。
基準パスからの相対パスを取得する(os.path.relpath
)
os.path.relpath
は、指定されたパスを基準パスからの相対パスに変換するための関数です。第1引数path
には相対パスに変換したいパスを、第2引数start
(オプション)には基準となるディレクトリのパスを与えます。第2引数を与えない場合にはカレントディレクトリを基準にした相対パスに変換します。
import os
path = 'C:\\Users\\user\\documents\\file.txt' # 変換するパス
start = 'C:\\Users\\user' # 基準パス
relpath = os.path.relpath(path, start)
print(relpath) # documents\file.txt
パスが実在するかどうかは関係なく、文字列として処理されます。引数のpath
とstart
は絶対パスを指定することが推奨です。
Windowsでは、異なるドライブにあるパスを比較するとValueError
が発生します。
パスの共通部分を取得する(os.path.commonpath
)
os.path.commonpath
は、指定された複数のパスから共通の部分を抽出するための関数です。この関数は、与えられたパスのリストやタプルの中で、すべてのパスが共有しているディレクトリの階層を見つけ出します。
import os
paths = [
'C:\\Users\\user\\documents\\file1.txt',
'C:\\Users\\user\\documents\\file2.txt',
'C:\\Users\\user\\documents\\image\\model.jpg'
]
common_path = os.path.commonpath(paths)
print(common_path) # C:\Users\user\documents
この関数は、パスが異なるファイルシステムやドライブ上にある場合にエラーになります。
また、相対パスと絶対パスが混在している場合もエラーになります。共通部分を取得するには、絶対パスどうしか、相対パスどうしでなければなりません。
import os
# 絶対パスと相対パスが混在している場合
paths = [
'C:\\Users\\user\\documents\\file1.txt',
'documents\\file2.txt'
]
common_path = os.path.commonpath(paths) # エラー
os.path.commonpath
を利用すると、指定したパスが同じディレクトリ階層に属しているかどうかを確認することができます。
import os
path = 'C:\\Users\\user\\documents\\file.txt'
# 同じディレクトリに属している場合
path2 = 'C:\\Users\\user\\'
print(os.path.commonpath([path2]) == os.path.commonpath([path, path2])) # True
# 同じディレクトリに属していない場合
path3 = 'C:\\Test\\'
print(os.path.commonpath([path3]) == os.path.commonpath([path, path3])) # False
この関数はパスが実際に存在するかどうかは調べません。
パスを正規化する(os.path.normpath
)
os.path.normpath
は、指定されたパスを正規化(標準的な形式に整形)するための関数です。この関数を使用すると、パス内の冗長な要素を取り除いたり、ディレクトリの区切り文字の不整合を解消することができます。
たとえば、..
や.
のような相対パスの要素を除去したり、スラッシュやバックスラッシュの混在や重複を修正するのに役立ちます。
引数path
には正規化したいパスを指定します。
import os
# パスの途中に. や.. がある場合
path = 'C:\\Users\\.\\user\\document\\'
print(os.path.normpath(path)) # C:\Users\user\document
path = 'C:\\Users\\..\\Users\\user\\document\\'
print(os.path.normpath(path)) # C:\Users\user\document
# パスの中にスラッシュとバックスラッシュの混在や重複がある場合
path = 'C:\\\\Users\\user/document/'
print(os.path.normpath(path)) # C:\Users\user\document
この関数は文字列としてパスを整形するだけで、実際にそのパスが存在するかどうかを確認しません。
また、相対パスは相対パスのまま整理されます。絶対パスが必要な場合にはos.path.abspath
により変換します。
ディレクトリの区切り文字はOSに合わせて自動的に調整されます。
パスを結合する (os.path.join
)
os.path.join
は、複数のパス要素を正しいパス形式で結合するための関数です。この関数は、異なるOS (Windows、Linux、macOSなど)に応じた適切な区切り文字を使って、ディレクトリやファイルのパスを作成します。引数path
, *paths
には結合するパス要素を与えます。
import os
path = os.path.join('C:\\', 'Users', 'user', 'documents', 'file.txt')
print(path) # C:\Users\user\documents\file.txt
引数のどこかに絶対パスが含まれると、その絶対パスから結合が始まり、それ以前の部分は無視されます。
import os
path = os.path.join('Users', 'user', 'C:\\documents', 'file.txt')
print(path) # C:\documents\file.txt
C:\documents
が絶対パスであるため、Users
とuser
が無視されます。
この関数はパスが実際に存在するかどうかは調べません。
パスが存在するか確認する (os.path.exists
, os.path.lexists
)
os.path.exists
は、指定されたパスが存在するかどうかを確認するための関数です。存在すればTrue
、存在しなければFalse
を返します。引数path
にはパスを指定します。
import os
print(os.path.exists('C:\\')) # True
シンボリックリンクのパスを指定した場合には、リンク先が存在する場合はTrue
、存在しない場合はFalse
を返します。
os.path.lexists
も同様の動作をしますがos.path.exists
と異なり、シンボリックリンク自体が存在するかどうかを調べます。
import os
print(os.path.lexists('C:\\')) # True
パスがファイルか確認する (os.path.isfile
)
os.path.isfile
は、指定されたパスがファイルかどうかを確認するための関数です。ファイルを指している場合にはTrue
を返し、それ以外の場合はFalse
を返します。引数path
にはパスを指定します。
import os
# ディレクトリの場合
dir = os.path.isfile('C:\\Users\\user\\documents\\')
print(dir) # False
# ファイルの場合
file = os.path.isfile('C:\\Users\\user\\documents\\file.txt')
print(file) # True
シンボリックリンクのパスを指定した場合には、リンク先がファイルの場合にはTrue
、そうでない場合にはFalse
を返します。リンクが壊れている場合はFalse
を返します。
パスがディレクトリか確認する (os.path.isdir
)
os.path.isdir
は、指定されたパスがディレクトリかどうかを確認するための関数です。ディレクトリを指している場合はTrue
を返し、それ以外の場合はFalse
を返します。引数path
にはパスを指定します。
import os
# ディレクトリの場合
dir = os.path.isdir('C:\\Users\\user\\documents\\')
print(dir) # True
# ファイルの場合
file = os.path.isdir('C:\\Users\\user\\documents\\file.txt')
print(file) # False
シンボリックリンクのパスを指定した場合には、リンク先がディレクトリの場合にはTrue
、そうでない場合にはFalse
を返します。リンクが壊れている場合はFalse
を返します。
パスが絶対パスかを確認する(os.path.isabs
)
os.path.isabs
は、指定されたパスが絶対パスかどうかを確認するための関数です。この関数は、パスが絶対パスであればTrue
、それ以外ではFalse
を返します。引数path
にはパスを指定します。
絶対パスかどうかの判定は、OSごとに異なるパス形式に基づいて行われます。例えば、Windowsではドライブ名(C:\
など)から始まるものが絶対パスとして認識され、Unix系システムではルートディレクトリ/
から始まるものが絶対パスになります。
import os
# 絶対パスの場合
path = 'C:\\Users\\user\\documents\\file.txt'
print(os.path.isabs(path)) # True
# 相対パスの場合
path = 'documents\\file.txt'
print(os.path.isabs(path)) # False
この関数は、パスが実際に存在するかどうかは確認しません。
2つのパスが同じ場所を指しているかを確認する(os.path.samefile
)
os.path.samefile
は、2つのパスが同じファイルシステム上の同じ場所を指しているかどうかを判断します。これにより、シンボリックリンクや相対パス、絶対パスなどが異なっても、同じファイルやディレクトリを指しているかどうかを検出できます。同じところを指している場合にはTrue
、そうでなければFalse
を返します。引数path1
, path2
にはパスを指定します。
import os
# 同じ場所を指している場合
path1 = 'C:\\Users\\user\\documents\\file.txt'
path2 = 'C:\\Users\\user\\documents\\..\\documents\\file.txt'
print(os.path.samefile(path1, path2)) # True
# 異なる場所を指している場合
path1 = 'C:\\Users\\user\\documents\\file.txt'
path2 = 'C:\\Users\\user\\documents\\'
print(os.path.samefile(path1, path2)) # False
この関数で指定したパスは実在している必要があります。
パスが存在しない場合にはエラーFileNotFoundError
が発生します。
パスがシンボリックリンクか確認する(os.path.islink
)
os.path.islink
は、指定されたパスがシンボリックリンクかどうかを判定するための関数です。シンボリックリックリンクの場合にTrue
を返し、それ以外ではFalse
を返します。引き数path
にはパスを指定します。
import os
# シンボリックリンクの場合
path = '.\\link'
print(os.path.islink(path)) # True
# シンボリックリンクではない場合
path = '.\\'
print(os.path.islink(path)) # False
この関数はシンボリックリンクかどうかだけを判別し、リンクが切れていてもシンボリックリンク自体が存在すればTrue
を返します。
また、存在しないパスが入力された場合にはFalse
を返します。
シンボリックリンクが指すパスを取得する(os.readlink
)
os.readlink
は、指定されたシンボリックリンクが参照している、リンク先のパスを取得する関数です。引数path
にはシンボリックリンクのパスを指定します。
import os
path = '.\\link'
print(os.readlink(path)) # シンボリックリンクのリンク先のパスが出力される
# file.txt
この関数はシンボリックリンクのみを対象とし、指定されたパスがシンボリックリンクでない場合や存在しない場合はエラーが発生します。
ディレクトリツリーを再帰的に辿りファイルとディレクトリをリストアップする(os.walk
)
os.walk
は、指定したディレクトリツリーを再帰的に巡回するための関数です。指定されたディレクトリよりも下(子ディレクトリ)にある全サブディレクトリおよびファイルを含む構造を辿り、ツリー中のすべてのファイルやディレクトリを処理するために使用できます。
関数の構造は以下のようになります。
import os
os.walk(top, topdown=True, onerror=None, followlinks=False)
第1引数top
には、巡回の開始点となるディレクトリパスを指定します。
第2引数topdown
(オプション)は、True
の場合、ディレクトリを上から下(親ディレクトリから子ディレクトリ)に辿ります。また、False
の場合は逆に下から上に辿ります。デフォルトはTrue
です。
第3引数onerror
(オプション)は、例外が発生した際に実行するエラーハンドラを指定します。デフォルトではNone
です。
第4引数followlinks
(オプション)は、True
にするとシンボリックリンクを辿ります。デフォルトはFalse
です。
この関数は、3つの要素(dirpath, dirnames, filenames)
をもつタプルを返します。dirpath
は探索中のディレクトリのパス、dirnames
は探索中のディレクトリ内にあるすべてのサブディレクトリのリスト、filenames
は探索中のディレクトリ内にあるすべてのファイルのリストになります。
os.walk
とfor
文を併用することで、ディレクトリを再帰的に循環しながら、探索範囲内のすべてのサブディレクトリとファイルのリストを取得できます。使用例を以下に示します。
import os
for dirpath, dirnames, filenames in os.walk('C:\\test'):
print(f'Directory: {dirpath}') # 探索中のディレクトリ
print(f'Sub-directory: {dirnames}') # 探索中のディレクトリ内のサブディレクトリのリスト
print(f'Files: {filenames}') # 探索中のディレクトリ内のファイルのリスト
print()
例えば、C:\test
内のディレクトリとファイルの構造が、
C:\test
├─Python-Projects
│ ├─ProjectA
│ └─ProjectB
└─Python-Snippets
└─Path
test.py
の場合には、次のような出力が得られます。
Directory: C:\test\
Sub-directory: ['Python-Projects', 'Python-Snippets']
Files: []
Directory: C:\test\Python-Projects
Sub-directory: ['ProjectA', 'ProjectB']
Files: []
Directory: C:\test\Python-Projects\ProjectA
Sub-directory: []
Files: []
Directory: C:\test\Python-Projects\ProjectB
Sub-directory: []
Files: []
Directory: C:\test\Python-Snippets
Sub-directory: ['Path']
Files: []
Directory: C:\test\Python-Snippets\Path
Sub-directory: []
Files: ['test.py']
os.walk
はカレントディレクトリを変更しません(for
文の中でos.getcwd()
を出力すると同じディレクトリを出力します)。
シンボリックリンクをたどるにはfollowlinks=True
に設定しますが、シンボリックリンクをたどると無限ループが発生する可能性があるため、注意が必要です。
ディレクトリ内のファイルとディレクトリをリストアップする(os.listdir
)
os.listdir
は、指定されたディレクトリ内のファイルやサブディレクトリの名前をリストとして取得するための関数です。リストの順番は不定です。引数path
(オプション)には取得したいディレクトリのパスを指定します(デフォルトはカレントディレクトリ)。
import os
items = os.listdir('.')
print(items) # カレントディレクトリ内のファイルとディレクトリのリスト
# ['dir', 'file.txt', 'test.py']
結果にはディレクトリとファイルが混在しており、ファイルとディレクトリの区別は行われません。ファイルとディレクトリを区別する場合には、os.path.isdir
やos.path.isfile
と組み合わせて使用します。
引数に存在しないパスを与えた場合には、FileNotFoundError
が返されます。シンボリックリンクの場合には、シンボリックリンクの名前がそのまま表示されます。この関数は、指定したパスのディレクトリ内のみをリスト化し、再帰的にディレクトリは辿りません。
チルダ記号(~
)をホームディレクトリに展開する(os.path.expanduser
)
os.path.expanduser
は、指定されたパス文字列内にあるチルダ記号(~
)をユーザーのホームディレクトリに展開するための関数です。引数path
にはパスを指定します。
import os
path = os.path.expanduser('~')
print(path) # C:\Users\user
パスにチルダがない場合には、パスをそのまま返します。また、文字列として処理するため、パスが実在するかどうかは調べません。
ファイルの操作
ファイルを削除する(os.remove
, os.unlink
)
os.remove
は、指定されたファイルを削除するための関数です。ディレクトリの削除には対応していないため、ディレクトリを削除する場合はos.rmdir
やshutil.rmtree
などを使用します。引数path
にはファイルパスを指定します。
import os
os.remove('.\\file.txt')
ファイルが存在しない場合には、エラーFileNotFoundError
が発生します。
POSIXシステムの場合には、os.unlink
も使用されます。
POSIX(Portable Operating System Interface)は、異なるオペレーティングシステム間で互換性のある環境を提供するために、IEEE(米国電気電子学会)が定めた標準規格です。
ディレクトリを作成する(os.mkdir
)
os.mkdir
は、指定されたパスに新しいディレクトリを作成するための関数です。第1引数path
には作成したいディレクトリのパスを指定し、第2引数mode
(オプション)には、新しく作成するディレクトリのアクセス許可を8進数(0o755
など)で指定します(デフォルトは0o777
)。
import os
# 新しいディレクトリの作成
os.mkdir('.\\new_dir', mode=0o755)
新しいディレクトリを作成するためには、親ディレクトリがすでに存在している必要あります。
また、作成したいディレクトリが既に存在している場合には、エラーが発生します。
複数階層のディレクトリを作成する(os.makedirs
)
os.makedirs
は、親ディレクトリを含む複数階層のディレクトリを一度に作成するための関数です。
第1引数path
には作成したいディレクトリのパスを指定します。
第2引数mode
(オプション)には、新しく作成するディレクトリのアクセス許可を8進数(0o755
など)で指定します(デフォルト=0o777
)。
第3引数exist_ok
(オプション)は、ディレクトリが既に存在する場合に無視するかどうかをプール値で指定します(デフォルト=False
)。True
に設定すると、作成したいディレクトリが既に存在していてもエラーが発生しません。
使用例を以下に示します。
import os
# 複数階層のディレクトリを作成する(既にディレクトリが存在してもエラーにしない)
os.makedirs('.\\new_dir\\sub_dir', exist_ok=True)
exist_ok=False
の場合には、すでに作成したいディレクトリが存在しているとエラーが発生します。
ただし、最後のディレクトリ(ここではsub_dir
)が存在していなければ、親ディレクトリが存在していてもエラーにはなりません。
空のディレクトリを削除する(os.rmdir
)
os.rmdir
は、指定した空のディレクトリを削除するための関数です。引数path
にはパスを指定します。
import os
os.rmdir('.\\new_dir')
ディレクトリが空でない場合や、指定されたパスが存在しない場合、ディレクトリでない場合にはエラーが発生します。
ファイルやディレクトリの名前を変更する(os.rename
)
os.rename
は、指定したファイルやディレクトリの名前を変更したり、別のディレクトリに移動したりするための関数です。現在の名前と新しい名前(またはパス)を指定することで、ファイルやディレクトリのリネームや移動を簡単に行うことができます。
第1引数src
には現在のファイルやディレクトリのパス、第2引数dst
には新しい名前または移動先のパスを指定します。
名前を変更する場合には、次のように変更前と変更後の名前を指定します。
import os
# ファイル名の変更
os.rename('old_name.txt', 'new_name.txt')
# ディレクトリ名の変更
os.rename('old_folder', 'new_folder')
ファイルを移動する場合には、第2引数にパスを指定します。
import os
# ファイルを別のディレクトリに移動
os.rename('file.txt', 'new_folder\\file.txt')
Windowsでは、既に変更先のファイルやディレクトリが存在している場合にはエラーが発生します(Linuxではユーザーのパーミッションがあれば置換されます)。
また、変更前のファイルやディレクトリが存在しない場合にはエラーが発生します。
ファイルを別のファイルに置き換える(os.replace
)
os.replace
は、指定されたファイルを別のファイルに名前変更または置き換えるための関数です。os.rename
と似ていますが、置き換え先にファイルが既に存在している場合でも上書きされます。
第1引数src
には現在のファイルやディレクトリのパス、第2引数dst
には新しい名前または移動先のパスを指定します。
import os
# ファイル名の変更
os.replace('old_name.txt', 'new_name.txt')
ファイルを移動する場合には、第2引数にパスを指定します。
import os
# ファイルを別のディレクトリに移動
os.replace('file.txt', 'new_folder\\file.txt')
変更前のファイルが存在しない場合にはエラーが発生します。
ディレクトリに適用する場合には、WindowsとUnix系のOSで挙動が異なるため、使用することは非推奨です。
ファイルのサイズを取得する(os.path.getsize
)
os.path.getsize
は、指定されたファイルのサイズをバイト単位で取得するための関数です。引数path
にはファイルパスを指定します。
import os
size = os.path.getsize('.\\file.txt')
print(size) # 16 (バイト単位)
存在しないパスを指定した場合にはエラーが発生します。
また、ディレクトリパスを指定してもエラーは発生しませんが、ディレクトリの中のファイルサイズの合計は得られません。
ファイルやディレクトリのタイムスタンプを取得する(os.path.getmtime
, os.path.getatime
, os.path.getctime
)
os.path.getmtime
, os.path.getatime
, os.path.getctime
は、ファイルやディレクトリのタイプスタンプ(時刻情報)を取得するための関数です。
それぞれファイルの作成時刻、最終アクセス時刻、最終変更時刻を取得します。引数path
にはパスを指定します。
import os
import time
path = '.\\file.txt'
# 最終更新時刻の取得
mtime = os.path.getmtime(path)
print(time.ctime(mtime)) # Sat Nov 2 18:25:55 2024
# 最終アクセス時刻の取得
atime = os.path.getatime(path)
print(time.ctime(atime)) # Sat Nov 2 19:08:39 2024
# 作成時刻の取得
ctime = os.path.getctime(path)
print(time.ctime(ctime)) # Sat Nov 2 18:25:46 2024
これらの関数はエポック秒(1970年1月1日からの秒数)を出力するため、人が見てわかりやすいようにtime.ctime
により表示方法を変更しています。
指定したパスが存在しない場合にはエラーが発生します。
ファイルやディレクトリのメタデータを取得する(os.stat
)
os.stat
は、指定されたファイルやディレクトリのメタデータを取得するための関数です。引数path
には、メタデータを取得したいファイルまたはディレクトリのパスを指定します。
import os
stat_info = os.stat('.\\file.txt')
print(stat_info.st_mode) # ファイルのモード(パーミッションやファイルの種別)
print(stat_info.st_ino) # ファイルのinode番号
print(stat_info.st_dev) # ファイルがあるデバイスのID
print(stat_info.st_nlink) # ハードリンクの数
print(stat_info.st_uid) # 所有者のユーザーID
print(stat_info.st_gid) # 所有グループID
print(stat_info.st_size) # ファイルのサイズ(バイト単位)
print(stat_info.st_atime) # 最終アクセス時刻(エポック秒)
print(stat_info.st_mtime) # 最終更新時刻(エポック秒)
print(stat_info.st_ctime) # ファイル作成時刻(エポック秒)
エポック秒は1970年1月1日からの秒数で、time.ctime
などで分かりやすい表示形式に変更できます。
存在しないパスを指定した場合にはエラーが発生します。
シンボリックリンクを作成する(os.symlink
)
os.symlink
は、シンボリックリンクを作成するための関数です。第1引数src
はリンク元となるファイルまたはディレクトリのパスを、第2引数dst
は作成するシンボリックリンクのパス(リンク先の名前)を指定します。このコマンドを実行するには、ユーザーが管理者権限をもっている必要があります。
import os
os.symlink('file.txt', 'link_to_file.txt')
すでに同名のファイルが存在している場合にはエラーが発生します。
リンク元のパスが存在しない場合はエラーは発生せず、リンク先を参照できないシンボリックリンクが作成されることに注意が必要です。
ハードリンクを作成する(os.link
)
os.link
は、ハードリンクを作成するための関数です。第1引数src
はリンク元となるファイルのパスを、第2引数dst
は作成するハードリンクのパス(リンク先の名前)を指定します。第3引数dst_dir_fd
(オプション)はファイルディスクリプタを使用してリンクを作成する場合に指定します(デフォルトはNone
)。第4引数follow_symlinks
(オプション)は、True
(デフォルト)の場合、シンボリックリンクが指定されていればリンク先を参照します。False
の場合には、シンボリックリンク自体をリンク対象とします。
import os
os.link('file.txt', 'link_to_file.txt')
すでに同名のファイルが存在している場合や、リンク元が実在しない場合にはエラーが発生します。
アクセス権を変更する(os.chmod
)
os.chmodは、指定したファイルやディレクトリのアクセス権限(パーミッション)を変更するための関数です。第1引数path
には権限を変更したいファイルまたはディレクトリのパスを、第2引数mode
には新しい権限を8進数(0o755
など)で指定します。
import os
os.chmod('file.txt', 0o755)
mode
は8進数で表され、読み取り(4
)、書き込み(2
)、実行(1
)を組み合わせたものを使用します(つまり0~7
の値)。この整数0~7
を所有者、グループユーザー、その他に対して順に並べて設定します(0o777
など)。
WindowsではPOSIXのような詳細な権限管理が存在しないため、動作が制限されることがあります。
例えば、0o444
を設定すると読み取り専用になります。
まとめ
Pythonのos
モジュールでパスやファイルを扱うコマンドについて概要と使用例をまとめました。ご参考になりましたら幸いです。