S-JIS[2021-04-06] 変更履歴

Pythonのファイル操作

Python3.6.4のファイル操作のメモ。


概要

ファイルを開くopen関数等には、パスを渡す。
このパスには文字列(str)の他、Pathオブジェクト(Python3.4以降)が使える。(JavaのFileクラスPathクラスに相当する)

from pathlib import Path

path1 = "/tmp/zzz.txt"
path2 = Path("/tmp/zzz.txt")

Pathクラスの実体は、Windows用やUNIX用に分かれている。


パスの例

パスを文字列で扱う場合、パスの操作はos.pathモジュールのメソッドで行う。

import os

Pathオブジェクトの場合はPathのメソッドで操作する。

from pathlib import Path

パスだけを扱う(ファイルシステムにはアクセスしない)場合は、PurePathオブジェクトを使用することも出来る。

from pathlib import PurePath

Python3.6から、os.pathの各メソッドの引数に文字列だけでなくPathLikeオブジェクト(PathやPurePath)も指定できるようになったらしい。

説明 Java相当
  文字列(str) Pathオブジェクト
PurePathオブジェクト
Fileクラス Pathクラス
パス生成 path = "/tmp" path = Path("/tmp")
path = PurePath("/tmp")
  var file = new File("/tmp"); var path = Path.of("/tmp");
パス結合 os.path.join("/tmp", "zzz") Path("/tmp", "zzz")
Path("/tmp") / "zzz"
Path("/tmp").joinpath("zzz")
  new File("/tmp", "zzz"); Path.of("/tmp", "zzz");
Path.of("/tmp").resolve("zzz");
親ディレクトリー取得 os.path.dirname("/tmp/zzz.txt")
# /tmp
Path("/tmp/zzz.txt").parent パスの親ディレクトリーを取得する。 file.getParentFile() // File
file.getParent() // String
path.getParent()
ファイル名取得 os.path.basename("/tmp/zzz.txt")
# zzz.txt
Path("/tmp/zzz.txt").name パスの末尾を取得する。 file.getName() // String path.getFileName()
path.getName(path.getNameCount()-1)
ファイル名置換   Path("/tmp/src.txt").with_name("dst.txt")
# /tmp/dst.txt
     
親ディレクトリー・ファイル名取得 dir, base = os.path.split("/tmp/zzz.txt")   パスの親ディレクトリーと末尾を同時に取得する。    
ドライブ取得 drive, tail = os.path.splitdrive("D:/tmp")
# drive = D:
# tail = /tmp
drive = Path("D:/tmp").drive Windowsのドライブ(と残りのパス)を取得する。    
拡張子取得 base, ext = os.path.splitext("/tmp/zzz.txt")
# base = /tmp/zzz
# ext = .txt
ext = Path("/tmp/zzz.txt").suffix
# ext = .txt
拡張子を取得する。    
  exts = Path("zzz.tar.gz").suffixes
# exts = ['.tar', '.gz']
   
拡張子置換   Path("/tmp/zzz.txt").with_suffix(".gz")
# /tmp/zzz.gz
     
拡張子除去   Path("/tmp/zzz.tar.gz").stem
# zzz.tar
     
共通パス取得 os.path.commonpath(["/tmp/11", "/tmp/12"])
# /tmp
3.5        
共通接頭辞取得 os.path.commonprefix(["/tmp/11", "/tmp/12"])
# /tmp/1
       
相対パス取得 os.path.relpath("/tmp/11", "/tmp")
# 11
Path("/tmp/11").relative_to("/tmp") 相対パスを取得する。   Path.of("/tmp").relativize(Path.of("/tmp/11"))
環境変数展開 os.path.expandvars("$TMP/zzz")   環境変数を展開する。
$環境変数名」「${環境変数名}」が変換可能。
Windowsの場合は「%環境変数名%」も変換可能。
   
POSIX化   Path("D:\\tmp").as_posix()
# D:/tmp
パス区切り文字を「/」に変換する。    
URI取得   Path("D:/tmp").as_uri()
# file:///D:/tmp
  new File("D:/tmp").toURI()  

ファイル属性の例

説明 Java相当
  文字列(str) Pathオブジェクト Fileクラス Pathクラス
正規化かつ絶対パス取得 os.path.abspath(".") Path(".").resolve()      
絶対パス取得       file.getAbsoluteFile() // File
file.getAbsolutePath() // String
path.toAbsolutePath()
正規化パス取得 os.path.normpath("/tmp/..")     file.getCanonicalFile() // File
file.getCanonicalPath() // String
path.normalize()
カレントディレクトリー取得 os.getcwd() Path.cwd()      
ホームディレクトリー取得   Path.home() 3.5   System.getProperty("user.home")
ホームディレクトリー展開 os.path.expanduser("~/bin") Path("~/bin").expanduser() 3.5 ~」「~ユーザー名」を展開する。    
環境変数展開 os.path.expandvars("$TMP/zzz")   環境変数を展開する。
$環境変数名」「${環境変数名}」が変換可能。
Windowsの場合は「%環境変数名%」も変換可能。
   
ファイル存在確認 os.path.exists("/tmp") Path("/tmp").exists()   file.exists() Files.exists(path)
ファイルサイズ取得 os.path.getsize("/tmp/zzz.txt") Path("/tmp/zzz.txt").stat().st_size   file.length() Files.size(path)
作成日時取得 import time
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.path.getctime("/tmp/zzz.txt")))
  os.path.getXtimeはエポック秒を返す。    
更新日時取得 os.path.getmtime("/tmp/zzz.txt")   new java.util.Date(file.lastModified()) Files.getLastModifiedTime(path)
最終アクセス日時取得 os.path.getatime("/tmp/zzz.txt")      
絶対パスかどうか os.path.isabs("/tmp") Path("/tmp").is_absolute()   file.isAbsolute() path.isAbsolute()
ファイルかどうか os.path.isfile("/tmp/zzz.txt") Path("/tmp/zzz.txt").is_file()   file.isFile() Files.isRegularFile(path)
ディレクトリーかどうか os.path.isdir("/tmp") Path("/tmp").is_dir()   file.isDirectory() Files.isDirectory(path)
シンボリックリンクかどうか os.path.islink(path) path.is_symlink()     Files.isSymbolicLink(path)
同一ファイルかどうか os.path.samefile(path1, path2) path1.samefile(path2)     Files.isSameFile(path1, path2)

ファイル・ディレクトリー操作の例

説明 Java相当
  文字列(str) Pathオブジェクト Fileクラス Pathクラス
ファイル名変更 os.rename("src", "dst") Path("src").rename("dst")   new File("src").renameTo(new File("dir")); Files.move(Path.of("src"), Path.of("dst"));
ファイル削除 os.remove("zzz.txt") Path("zzz.txt").unlink()   new File("zzz.txt").delete(); Files.delete(Path.of("zzz.txt"));
Files.deleteIfExists(Path.of("zzz.txt"));
ディレクトリー作成 os.mkdir("/tmp/zzz") Path("/tmp/zzz").mkdir()   new File("/tmp/zzz").mkdir(); Files.createDirectory(Path.of("/tmp/zzz"));
os.mkdirs("/tmp/zzz/11") Path("/tmp/zzz/11").mkdir(parents=True)   new File("/tmp/zzz/11").mkdirs(); Files.createDirectories(Path.of("/tmp/zzz/11"));
ディレクトリー削除 os.rmdir("/tmp/zzz")
os.removedirs("/tmp/zzz")
Path("/tmp/zzz").rmdir()   new File("/tmp/zzz").delete(); Files.delete(Path.of("/tmp/zzz"));
ファイル一覧取得 for name in os.listdir("/tmp"):
  print(name)
       
with in os.scandir("/tmp") as it:
  for entry in it:
    print(entry.path)
for path in Path("/tmp").iterdir():
  print(path)
  new File("/tmp").listFiles() Files.list(Path.of("/tmp"))
for root, dirs, files in os.walk("/tmp"):
  print(root)
  print(dirs)
  print(files)
for path in Path("/tmp").glob("**/*"):
  print(path)
再帰的に取得する。   Files.walk(Path.of("/tmp"))

Pythonへ戻る / 技術メモへ戻る
メールの送信先:ひしだま