"os.path" --- 共通のパス名操作
******************************

**Source code:** Lib/posixpath.py (for POSIX) and Lib/ntpath.py (for
Windows).

======================================================================

This module implements some useful functions on pathnames. To read or
write files see "open()", and for accessing the filesystem see the
"os" module. The path parameters can be passed as strings, or bytes,
or any object implementing the "os.PathLike" protocol.

Unix シェルとは異なり、Python はあらゆるパス展開を *自動的には* 行いま
せん。アプリケーションがシェルのようなパス展開を必要とした場合は、
"expanduser()" や "expandvars()" といった関数を明示的に呼び出すことで
行えます。("glob" モジュールも参照してください)

参考: "pathlib" モジュールは高水準のパスオブジェクトを提供します。

注釈:

  以下のすべての関数は、そのパラメータにバイト列のみ、あるいは文字列の
  み受け付けます。パスまたはファイル名を返す場合、返り値は同じ型のオブ
  ジェクトになります。

注釈:

  OS によって異なるパス名の決まりがあるため、標準ライブラリにはこのモ
  ジュールのいくつかのバージョンが含まれています。 "os.path" モジュー
  ルは常に現在 Python が動作している OS に適したパスモジュールであるた
  め、ローカルのパスを扱うのに適しています。各々のモジュールをインポー
  トして *常に* 一つのフォーマットを利用することも可能です。これらはす
  べて同じインターフェースを持っています:

  * "posixpath" UNIX スタイルのパス用

  * "ntpath" Windows パス用

バージョン 3.8 で変更: "exists()"、 "lexists()"、 "isdir()"、
"isfile()"、 "islink()"、および "ismount()" は、OS レベルで表現できな
い文字列を含む可能性がある例外を送出する代わりに "False" を返すように
なりました。

os.path.abspath(path)

   パス名 *path* の正規化された絶対パスを返します。ほとんどのプラット
   フォームでは、これは関数 "normpath()" を次のように呼び出した時と等
   価です: "normpath(join(os.getcwd(), path))"。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.basename(path)

   パス名 *path* の末尾のファイル名部分を返します。これは関数
   "split()" に *path* を渡した時に返されるペアの 2 番めの要素です。こ
   の関数が返すのは Unix の **basename** とは異なります; Unix の
   **basename** は "'/foo/bar/'" に対して "'bar'" を返しますが、関数
   "basename()" は空文字列 ("''") を返します。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.commonpath(paths)

   シーケンス *paths* 中の各パス名に共通するサブパスのうち、最も長いも
   のを返します。 *paths* に絶対パス名と相対パス名の両方が含まれている
   、 *paths* が異なるドライブ上にある、または *paths* が空の場合、
   "ValueError" を送出します。 "commonprefix()" とは異なり、有効なパス
   を返します。

   Availability: Unix, Windows。

   バージョン 3.5 で追加.

   バージョン 3.6 で変更: *path-like objects* のシーケンスを受け入れる
   ようになりました。

os.path.commonprefix(list)

   *list* 内のすべてのパスに共通する接頭辞のうち、最も長いものを (パス
   名の 1 文字 1 文字を判断して) 返します。*list* が空の場合、空文字列
   ("''") を返します。

   注釈:

     この関数は一度に 1 文字ずつ処理するため、不正なパスを返す場合があ
     ります。有効なパスを取得するためには、"commonpath()" を参照してく
     ださい。

        >>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
        '/usr/l'

        >>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
        '/usr'

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.dirname(path)

   パス名 *path* のディレクトリ名を返します。これは関数 "split()" に
   *path* を渡した時に返されるペアの 1 番めの要素です。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.exists(path)

   *path* が実在するパスかオープンしているファイル記述子を参照している
   場合 "True" を返します。壊れたシンボリックリンクについては "False"
   を返します。一部のプラットフォームでは、たとえ *path* が物理的に存
   在していたとしても、要求されたファイルに対する "os.stat()" の実行権
   がなければこの関数が "False" を返すことがあります。

   バージョン 3.3 で変更: *path* は整数でも可能になりました: それがオ
   ープンしているファイル記述子なら "True" が返り、それ以外なら
   "False" が返ります。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.lexists(path)

   *path* が実在するパスなら "True" を返します。壊れたシンボリックリン
   クについては "True" を返します。 "os.lstat()" がない環境では
   "exists()" と等価です。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.expanduser(path)

   Unix および Windows では、与えられた引数の先頭のパス要素 "~" 、また
   は "~user" を、 *user* のホームディレクトリのパスに置き換えて返しま
   す。

   Unix では、先頭の "~" は、環境変数 "HOME" が設定されているならその
   値に置き換えられます。設定されていない場合は、現在のユーザのホーム
   ディレクトリをビルトインモジュール "pwd" を使ってパスワードディレク
   トリから探して置き換えます。先頭の "~user" については、直接パスワー
   ドディレクトリから探します。

   Windows では、 "USERPROFILE" が設定されていればそれを使用します。設
   定されていない場合は、環境変数 "HOMEPATH" と "HOMEDRIVE" の組み合わ
   せで置き換えられます。先頭の "~user" は "~" で得られるユーザパスの
   最後のディレクトリ要素を除去したものを利用します。

   置き換えに失敗したり、引数のパスがチルダで始まっていなかった場合は
   、パスをそのまま返します。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

   バージョン 3.8 で変更: Windowsで  "HOME" は参照しなくなりました。

os.path.expandvars(path)

   引数のパスの環境変数を展開して返します。引数の中の "$name" または
   "${name}" のような形式の文字列は環境変数、 *name* の値に置き換えら
   れます。不正な変数名や存在しない変数名の場合には変換されず、そのま
   ま返します。

   Windows では、 "$name" や "${name}" の形式に加えて、 "%name%" の形
   式もサポートされています。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.getatime(path)

   *path* に最後にアクセスした時刻を返します。 返り値は、エポック
   ("time" モジュールを参照) からの経過秒数を与える浮動小数点数です。
   ファイルが存在しない、あるいはアクセスできなかった場合は "OSError"
   を送出します。

os.path.getmtime(path)

   *path* に最後に更新した時刻を返します。 返り値は、エポック ("time"
   モジュールを参照) からの経過秒数を与える浮動小数点数です。 ファイル
   が存在しない、あるいはアクセスできなかった場合は "OSError" を送出し
   ます。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.getctime(path)

   システムの ctime、Unix系など一部のシステムでは最後にメタデータが変
   更された時刻、Windows などその他のシステムでは *path* の作成時刻を
   返します。返り値はエポック ("time" モジュールを参照) からの経過時間
   を示す秒数になります。ファイルが存在しない、あるいはアクセスできな
   かった場合は "OSError" を送出します。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.getsize(path)

   *path* のサイズをバイト数で返します。ファイルが存在しない、あるいは
   アクセスできなかった場合は "OSError" を送出します。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.isabs(path)

   *path* が絶対パスなら "True" を返します。すなわち、 Unix ではスラッ
   シュで始まり、 Windows ではドライブレターに続く (バック) スラッシュ
   で始まる場合です。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.isfile(path)

   *path* が "存在する" 一般ファイルなら "True" を返します。 この関数
   はシンボリックリンクの先を辿るので、同じパスに対して "islink()" と
   "isfile()" の両方が真を返すことがあります。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.isdir(path)

   *path* が "存在する" ディレクトリなら "True" を返します。 この関数
   はシンボリックリンクの先を辿るので、同じパスに対して "islink()" と
   "isdir()" の両方が真を返すことがあります。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.islink(path)

   *path* が "存在する" ディレクトリを指すシンボリックリンクなら
   "True" を返します。 Python ランタイムがシンボリックリンクをサポート
   していないプラットフォームでは、常に "False" を返します。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.ismount(path)

   パス名 *path* がマウントポイント *mount point* (ファイルシステムの
   中で異なるファイルシステムがマウントされているところ) なら、 "True"
   を返します。 POSIX では、この関数は *path* の親ディレクトリである
   "*path*/.." が *path* と異なるデバイス上にあるか、あるいは
   "*path*/.." と *path* が同じデバイス上の同じ i-node を指しているか
   をチェックします --- これによって全ての Unix 系システムと POSIX 標
   準でマウントポイントが検出できます。 だたし、同じファイルシステムの
   bind mount の信頼できる検出はできません。 Windows では、ドライブレ
   ターを持つルートと共有 UNC は常にマウントポイントであり、また他のパ
   スでは、入力のパスが異なるデバイスからのものか見るために
   "GetVolumePathName" が呼び出されます。

   バージョン 3.4 で追加: Windows での、ルートでないマウントポイントの
   検出をサポートするようになっています。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.join(path, *paths)

   1 つあるいはそれ以上のパスの要素を賢く結合します。戻り値は *path*、
   ディレクトリの区切り文字を **paths* の各パートの(末尾でない場合の空
   文字列を除いて)頭に付けたもの、これらの結合になります。最後の部分が
   空文字列の場合に限り区切り文字で終わる文字列になります。付け加える
   要素に絶対パスがあれば、それより前の要素は全て破棄され、以降の要素
   を結合します。

   Windows の場合は、絶対パスの要素 (たとえば "r'\foo'") が見つかった
   場合はドライブレターはリセットされません。要素にドライブレターが含
   まれていれば、それより前の要素は全て破棄され、ドライブレターがリセ
   ットされます。各ドライブに対してカレントディレクトリがあるので、
   "os.path.join("c:", "foo")" によって、 "c:\foo" ではなく、ドライブ
   "C:" 上のカレントディレクトリからの相対パス("c:foo") が返されること
   に注意してください。

   バージョン 3.6 で変更: *path* と *paths* が *path-like object* を受
   け付けるようになりました。

os.path.normcase(path)

   パス名の大文字・小文字を正規化します。 Windowsでは、パス名にある文
   字を全て小文字に、スラッシュをバックスラッシュに変換します。 他のオ
   ペレーティングシステムでは、パスを変更せずに返します。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.normpath(path)

      パスを正規化します。余分な区切り文字や上位レベル参照を除去し、
      "A//B"、"A/B/"、"A/./B" や "A/foo/../B" などはすべて "A/B" にな
      ります。この文字列操作は、シンボリックリンクを含むパスの意味を変
      えてしまう場合があります。Windows では、スラッシュをバックスラッ
      シュに変換します。大文字小文字の正規化には "normcase()" を使用し
      てください。

   注釈:

        On POSIX systems, in accordance with IEEE Std 1003.1 2013
        Edition; 4.13 Pathname Resolution, if a pathname begins with
        exactly two slashes, the first component following the leading
        characters may be interpreted in an implementation-defined
        manner, although more than two leading characters shall be
        treated as a single character.

     バージョン 3.6 で変更: *path-like object* を受け入れるようになり
     ました。

os.path.realpath(path)

   パスの中のシンボリックリンク (もしそれが当該オペレーティングシステ
   ムでサポートされていれば) を取り除いて、指定されたファイル名を正規
   化したパスを返します。

   注釈:

     シンボリックリンクが循環している場合、循環したリンクのうちの一つ
     のパスが返されます。ただし、どのパスが返されるかは保証されません
     。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

   バージョン 3.8 で変更: Windows においてシンボリックリンクとジャンク
   ションが解決されるようになりました。

os.path.relpath(path, start=os.curdir)

   カレントディレクトリあるいはオプションの *start* ディレクトリからの
   *path* への相対パスを返します。これはパス計算で行っており、ファイル
   システムにアクセスして *path* や *start* の存在や性質を確認すること
   はありません。Windowsでは、 *path* と *start* が異なるドライブの場
   合、 "ValueError" を送出します。

   *start* のデフォルト値は "os.curdir" です。

   Availability: Unix, Windows。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.samefile(path1, path2)

   引数の両パス名が同じファイルまたはディレクトリを参照している場合、
   "True" を返します。これは、デバイス番号と i-node 番号で決定されます
   。どちらかのパス名への "os.stat()" 呼び出しが失敗した場合、例外が送
   出されます。

   Availability: Unix, Windows。

   バージョン 3.2 で変更: Windows サポートを追加しました。

   バージョン 3.4 で変更: Windows が他のプラットフォームと同じ実装を使
   用するようになりました。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.sameopenfile(fp1, fp2)

   ファイル記述子 *fp1* と *fp2* が同じファイルを参照していたら "True"
   を返します。

   Availability: Unix, Windows。

   バージョン 3.2 で変更: Windows サポートを追加しました。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.samestat(stat1, stat2)

   stat タプル *stat1* と *stat2* が同じファイルを参照していれば
   "True" を返します。これらのタプルは "os.fstat()" 、 "os.lstat()" あ
   るいは "os.stat()" の返り値で構いません。この関数は "samefile()" と
   "sameopenfile()" を使用した比較に基いて実装しています。

   Availability: Unix, Windows。

   バージョン 3.4 で変更: Windows サポートを追加しました。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.split(path)

   パス名 *path* を "(head, tail)" のペアに分割します。 *tail* はパス
   名の構成要素の末尾で、 *head* はそれより前の部分です。 *tail* はス
   ラッシュを含みません; もし *path* がスラッシュで終わっていれば
   *tail* は空文字列になります。もし *path* にスラッシュがなければ、
   *head* は空文字になります。 *path* が空文字なら、 *head* と *tail*
   の両方が空文字になります。 *head* の末尾のスラッシュは *head* がル
   ートディレクトリ (または 1 個以上のスラッシュだけ) でない限り取り除
   かれます。 "join(head, tail)" は常に *path* と同じ場所を返しますが
   、文字列としては異なるかもしれません。関数 "dirname()",
   "basename()" も参照してください。

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.splitdrive(path)

   パス名 *path* を "(drive, tail)" のペアに分割します。*drive* はマウ
   ントポイントか空文字列になります。ドライブ指定をサポートしていない
   システムでは、*drive* は常に空文字になります。どの場合でも、"drive
   + tail" は *path* と等しくなります。

   Windows では、パス名はドライブ名/UNC 共有ポイントと相対パスに分割さ
   れます。

   パスがドライブレターを含む場合、ドライブレターにはコロンまでが含ま
   れます:

      >>> splitdrive("c:/dir")
      ("c:", "/dir")

   If the path contains a UNC path, drive will contain the host name
   and share, up to but not including the fourth separator:

      >>> splitdrive("//host/computer/dir")
      ("//host/computer", "/dir")

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.splitext(path)

   Split the pathname *path* into a pair "(root, ext)"  such that
   "root + ext == path", and the extension, *ext*, is empty or begins
   with a period and contains at most one period.

   If the path contains no extension, *ext* will be "''":

      >>> splitext('bar')
      ('bar', '')

   If the path contains an extension, then *ext* will be set to this
   extension, including the leading period. Note that previous periods
   will be ignored:

      >>> splitext('foo.bar.exe')
      ('foo.bar', '.exe')
      >>> splitext('/foo/bar.exe')
      ('/foo/bar', '.exe')

   Leading periods of the last component of the path are considered to
   be part of the root:

      >>> splitext('.cshrc')
      ('.cshrc', '')
      >>> splitext('/foo/....jpg')
      ('/foo/....jpg', '')

   バージョン 3.6 で変更: *path-like object* を受け入れるようになりま
   した。

os.path.supports_unicode_filenames

   ファイル名に任意の Unicode 文字列を (システムの制限内で) 使用できる
   場合は "True" になります。
