TECHNOLOGY

Pythonによるパスとファイルの操作方法(osモジュール)

本記事では、Pythonのosモジュールでパスとファイルを操作する主要なコマンドの一覧と使用例について紹介します。

目次

はじめに

動作確認は、以下の環境で行っております。

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 

パスが実在するかどうかは関係なく、文字列として処理されます。引数のpathstartは絶対パスを指定することが推奨です。

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が絶対パスであるため、Usersuserが無視されます。

この関数はパスが実際に存在するかどうかは調べません。

パスが存在するか確認する (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は、指定されたパスがシンボリックリンクかどうかを判定するための関数です。シンボリックリックリンクの場合にTrueを返し、それ以外ではFalseを返します。引き数pathにはパスを指定します。

import os

# シンボリックリンクの場合
path = '.\\link'
print(os.path.islink(path)) # True

# シンボリックリンクではない場合
path = '.\\'
print(os.path.islink(path)) # False

この関数はシンボリックリンクかどうかだけを判別し、リンクが切れていてもシンボリックリンク自体が存在すればTrueを返します。

また、存在しないパスが入力された場合にはFalseを返します。

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.walkfor文を併用することで、ディレクトリを再帰的に循環しながら、探索範囲内のすべてのサブディレクトリとファイルのリストを取得できます。使用例を以下に示します。

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.isdiros.path.isfileと組み合わせて使用します。

引数に存在しないパスを与えた場合には、FileNotFoundErrorが返されます。シンボリックリンクの場合には、シンボリックリンクの名前がそのまま表示されます。この関数は、指定したパスのディレクトリ内のみをリスト化し、再帰的にディレクトリは辿りません。

チルダ記号(~)をホームディレクトリに展開する(os.path.expanduser

os.path.expanduserは、指定されたパス文字列内にあるチルダ記号(~)をユーザーのホームディレクトリに展開するための関数です。引数pathにはパスを指定します。

import os

path = os.path.expanduser('~')
print(path) # C:\Users\user

パスにチルダがない場合には、パスをそのまま返します。また、文字列として処理するため、パスが実在するかどうかは調べません。

ファイルの操作

os.removeは、指定されたファイルを削除するための関数です。ディレクトリの削除には対応していないため、ディレクトリを削除する場合はos.rmdirshutil.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')

既に変更先のファイルやディレクトリが存在している場合や、変更前のファイルやディレクトリが存在しない場合にはエラーが発生します。

ファイルを別のファイルに置き換える(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は、シンボリックリンクを作成するための関数です。第1引数srcはリンク元となるファイルまたはディレクトリのパスを、第2引数dstは作成するシンボリックリンクのパス(リンク先の名前)を指定します。このコマンドを実行するには、ユーザーが管理者権限をもっている必要があります。

import os
os.symlink('file.txt', 'link_to_file.txt')

すでに同名のファイルが存在している場合にはエラーが発生します。

リンク元のパスが存在しない場合はエラーは発生せず、リンク先を参照できないシンボリックリンクが作成されることに注意が必要です。

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など)。

例えば、0o444を設定すると読み取り専用になります。

まとめ

Pythonのosモジュールでパスやファイルを扱うコマンドについて概要と使用方法をまとめました。ご参考になりましたら幸いです。

-TECHNOLOGY
-