Python - パス・ファイル名の操作

公開日:2019-12-06 更新日:2019-12-06
[Python]

1. 概要

パス・ファイル名の操作についてです。

2. カレントディレクトリのパスの設定・取得

# 取得
print( os.getcwd() ) # D:\python\test

# 設定
os.chdir("D:/python")

# 取得(パスが変わる)
print( os.getcwd() ) # D:\python

3. 絶対パスの取得

ファイル名から絶対パスを取得します。
基準となるディレクトリのパスは、
実行しているスクリプトがあるディレクトリではなく、
カレントディレクトリ(os.getcwd())になります。

print(os.path.abspath('test.txt'))    # D:\python\test\test.txt
print(os.path.abspath('../test.txt')) # D:\python\test.txt
print(os.path.abspath('d:/test.txt')) # d:\test.txt

4. パスからファイル名の取得

print( os.path.basename('test.txt') )         # test.txt
print( os.path.basename('d:/test/test.txt') ) # test.txt
print( os.path.basename('d:/test/') )         # (空)
print( os.path.basename('d:/test') )          # test

5. ディレクトリのパスの取得

print( os.path.dirname('d:/test/test.txt') ) # d:/test
print( os.path.dirname('d:/test/') )         # d:/test
print( os.path.dirname('d:/test') )          # d:/
print( os.path.dirname('test.txt') )         # (空)

6. 親ディレクトリ名の取得

dir_path = os.path.dirname('d:/test/test.txt')
print( dir_path )                   # d:/test
print( os.path.basename(dir_path) ) # test

7. 2階層上のディレクトリのパスの取得

dir2 = os.path.dirname('d:/dir1/dir2/test.txt')
dir1 = os.path.dirname(dir2)
print( dir2 ) # d:/dir1/dir2
print( dir1 ) # d:/dir1

8. フォルダやファイルの存在チェック

print( os.path.exists('D:/python/test/test.py') )    # True
print( os.path.exists('D:/python/test/存在しない') ) # False 
print( os.path.exists('D:/python/test/') )           # True
print( os.path.exists('D:/python/test') )            # True

9. ファイルかどうかの判定

print( os.path.isfile('D:/python/test/test.py') ) # True
print( os.path.isfile('D:/python/test/') )        # False
print( os.path.isfile('D:/python/test') )         # False
print( os.path.isfile('D:/python/存在しない') )   # False

存在しないファイルの場合 False を返しますが、
厳密にファイルの存在チェックをする場合は exists() を使用してください。
ファイル名と同じ名前のディレクトリがある可能性があります。

10. ディレクトリかどうかの判定

print( os.path.isdir('D:/python/test/test.py') )  # False
print( os.path.isdir('D:/python/test/') )         # True
print( os.path.isdir('D:/python/test') )          # True
print( os.path.isfile('D:/python/存在しない') )   # False

11. 環境変数の展開

環境変数を割り当てられているパスに変換します。
print( os.path.expandvars('%TEMP%/test.py') ) # C:\Users\guest\AppData\Local\Temp/test.py

ユーザにパスを指定させる場面で、環境変数の使用を許可させたい場合に使用すると良いと思います。

12. ファイルサイズの取得

print( os.path.getsize('D:/python/test/test.py') ) # 2645

13. ファイルの作成日時、更新日時、アクセス日時の取得

import os
import time

path = 'D:/python/test/test.py'
c_time = os.path.getctime(path)
m_time = os.path.getmtime(path)
a_time = os.path.getatime(path)
print( c_time ) # 作成日時。エポック(基準日時)からの経過時間 1575176483.1841033
print( m_time ) # 更新日時
print( a_time ) # アクセス日時

print( time.gmtime(0) ) # エポック(基準日時)の取得 1970/01/01 00:00:00
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

# 経過時間から年月日時分秒を取得します
print( time.localtime(c_time).tm_year )  # 2019
print( time.localtime(c_time).tm_mon )   # 12
print( time.localtime(c_time).tm_mday )  # 1
print( time.localtime(c_time).tm_hour )  # 14
print( time.localtime(c_time).tm_min )   # 1
print( time.localtime(c_time).tm_sec )   # 23

14. パスの結合

print( os.path.join('c:/', 'test.txt') ) # c:/test.txt
print( os.path.join('c:', 'test.txt') )  # c:test.txt (要注意)
print( os.path.join('c:/dir1/dir2', 'test.txt') )       # c:/dir1/dir2\test.txt
print( os.path.join('c:/','dir1', 'dir2', 'test.txt') ) # c:/dir1\dir2\test.txt

15. パスの正規化

区切り文字の統一、../ の除去などを行います。
print( os.path.normpath('c:/dir1/../dir2/test.txt') ) # c:\dir2\test.txt
print( os.path.normpath('c:/dir1\\dir2/test.txt') )   # c:\dir1\dir2\test.txt
print( os.path.normpath('c:/dir1') )                  # c:\dir1
print( os.path.normpath('c:/dir1/') )                 # c:\dir1
print( os.path.normpath('c:/dir1///') )               # c:\dir1
print( os.path.normpath('c:///dir1///') )             # c:\dir1
print( os.path.normpath('../dir1/test.txt') )         # ..\dir1\test.txt

16. パスの分解

ディレクトリとファイル名、ファイル名と拡張子、ドライブとそれ以外のようにパスを分解します。
print( os.path.split('c:/dir1/dir2/test.txt') )      # ('c:/dir1/dir2', 'test.txt')
print( os.path.splitext('c:/dir1/dir2/test.txt') )   # ('c:/dir1/dir2/test', '.txt')
print( os.path.splitdrive('c:/dir1/dir2/test.txt') ) # ('c:', '/dir1/dir2/test.txt')

17. 相対パスの取得

print( os.path.relpath('c:/dir1/dir2', 'c:/dir_a/dir_b') ) # ..\..\dir1\dir2

18. 同じパスかどうかの判定

異なる表記のパスが同じかどうかを判定します。
print( os.getcwd() ) # D:\python\test
print( os.path.samefile('d:/python/test/test.py', 'test.py') )                        # True
print( os.path.samefile('d:/python/test/test.py', 'd:/python/test/../test/test.py') ) # True
print( os.path.samefile('d:/python/test', '../test') )                                # True