[Python] ファイルやディレクトリ操作まとめ
こんにちは、@yoheiMuneです。
今日はPython3系における、ファイルやディレクトリの操作方法を調べることが多いので、ブログにまとめておきたいと思います。
https://docs.python.jp/3/library/os.html
https://docs.python.jp/3/library/shutil.html
http://www.gesource.jp/programming/python/code/index.html
http://www.geocities.jp/morchin33/effective_python/file_system.html
最後になりますが本ブログでは、Python・Linux・Node.js・フロントエンド・インフラ・Go言語・開発関連・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!
今日はPython3系における、ファイルやディレクトリの操作方法を調べることが多いので、ブログにまとめておきたいと思います。
目次
ファイルの読み書き
openを用いてファイルの読み書きを行うことができます。
# ファイルへ書き込む
with open("a.txt", "w") as f:
f.write("memomemo")
# ファイルへ書き込む(追記)
with open("a.txt", "a") as f:
f.write("MEMOMEMO")
# ファイルを読み込む
with open("a.txt") as f:
text = f.read()
ファイル/ディレクトリの追加
ファイルやディレクトリの追加方法を書きたいと思います。ファイルへのtouch
touchも行うことができます(Python3.4〜)。
# ファイルへのtouch
from pathlib import Path
Path('b.txt').touch()
ディレクトリ作成(単一)
以下の実装でディレクトリを新規作成できます。
import os
os.mkdir("mydir")
ディレクトリ作成(階層あり)
mkdir -pも簡単に実現できます。
# ディレクトリの作成(階層あり)
import os
os.makedirs("mydir2/aaa/bbb/ccc")
ファイルやディレクトリの削除
ファイルやディレクトリの削除を行うための実装方法は以下の通りです。ファイルの削除
以下の実装でファイルを削除することができます。
import os
os.remove("b.txt")
ディレクトリの削除(空っぽの場合のみ)
ディレクトリが空の場合には、以下のコマンドで削除できますが、普通は後続のshutilを使う方が多いです。
# ディレクトリの削除(空っぽの場合のみ)
import os
os.rmdir("mydir")
ディレクトリの削除(中身があってもOK)
shutilを使うと、中身があってもディレクトリを削除できます。
# ディレクトリの削除(中身があってもOK)
import shutil
shutil.rmtree("mydir")
ファイルやディレクトリの存在確認
ここではファイルやディレクトリの存在確認を行う実装方法を紹介します。ファイルやディレクトリの存在確認
存在確認にはos.path.existsを利用します。
# ファイルやディレクトリの存在確認
import os
print(os.path.exists("a.txt"))
print(os.path.exists("mydir"))
ファイルが存在するかを確認する
指定されたパスがファイルであるかを確認します。
# ファイルが存在するかを確認する
import os
print(os.path.isfile("a.txt"))
ディレクトリが存在するかを確認する
指定されたパスがディレクトリであるかを確認します。
# ディレクトリが存在するかを確認する
import os
print(os.path.isdir("mydir"))
パスの操作
ファイルパスの文字列を操作する方法を記載します。パスの結合
os.path.joinを使うと、OSに依存しないパスの結合を行うことができます。
# パスの結合
os.path.join("aaa", "bbb", "ccc", "my.txt") # aaa/bbb/ccc/my.txt
パスからファイル名を取得する
os.path.basenameをつかうとパスからファイル名を取得できます。
# ファイル名を返す
os.path.basename("mydir/sub/ddd.txt") # ddd.txt
パスからディレクトリ名を取得する
os.path.dirnameをつかうとディレクトリ名を取得できます。
# ディレクトリ名を返す
print(os.path.dirname("mydir/sub/ddd.txt")) # mydir/sub
ファイルの拡張子を取得する
ファイルの拡張子も簡単に取得できます。
# ファイルの拡張子を取得する
root, ext = os.path.splitext("/var/log/myapp/aaaa.log")
print(root, ext) # /var/log/myapp/aaaa, log
絶対パスに変換する
相対パスを絶対パスに変換することができます。
# 絶対パスの取得
os.path.abspath(".") # /Users/yoheimune/work
絶対パスかを確認する
パスが絶対パスであるかを確認することができます。
# 絶対パスかの確認
os.path.isabs("/var/log") # True
ファイルやディレクトリの一覧の取得
ファイルやディレクトリの一覧を取得する方法です。指定したディレクトリにあるファイルやディレクトリの一覧
os.listdirをつかうと、指定ディレクトリ直下のファイルやディレクトリの一覧を取得できます。
# ファイル一覧を取得する
os.mkdir("mydir")
files = os.listdir("mydir")
print(files) # ['aa.txt', 'bb.log', 'cc.txt', 'subdir']
ワイルドカードを用いたファイルの探索
globモジュールを使うと、ワイルドカードを指定してファイルを探すことができます。
# ワイルドカードを利用
from glob import glob
files = glob("mydir/*.txt")
print(files) # ['mydir/aa.txt', 'mydir/cc.txt']
再帰的にファイルを収集する
再帰的にファイルを探すこともできます。
# 再帰的にファイルを収集する
for root, dirs, files in os.walk('./mydir'):
for fname in files:
print(os.path.join(root, fname))
# ./mydir/aa.txt
# ./mydir/bb.log
# ./mydir/cc.txt
# ./mydir/sub/ddd.txt
ファイルのメタ情報にアクセス
メタ情報にアクセスするには以下のように実装します。ファイルへの最終アクセス日
atimeを以下のように取得できます。
# 最終アクセス日
os.path.getatime("a.txt") # 1490175670.0
ファイルの最終更新日
最終更新日の取得も簡単です。
# 最終更新日
os.path.getmtime("a.txt") # 1490175670.0
ファイルサイズの取得
ファイルサイズを取得するには以下のように実装します。
# ファイルサイズ
os.path.getsize("a.txt") # 8
コピーと移動
ファイルやディレクトリのコピーや移動する方法を説明します。ファイルのコピー
ファイルのコピーは以下のように実現できます。
# ファイルのコピー
shutil.copyfile("a.txt", "c.txt")
ディレクトリのコピー
ディレクトリのコピーは以下のように実装します。
# ディレクトリのコピー
shutil.copytree("mydir", "mydir3")
ファイルの移動
以下のように実装します。
# ファイルの移動
shutil.move("c.txt", "d.txt")
ディレクトリの移動
以下のように実装します。
# ディレクトリの移動
shutil.move("mydir3", "mydir4c")
参考資料
Pythonのファイルやディレクトリ操作を学ぶために、以下の記事を参照しました。ありがとうございます。https://docs.python.jp/3/library/os.html
https://docs.python.jp/3/library/shutil.html
http://www.gesource.jp/programming/python/code/index.html
http://www.geocities.jp/morchin33/effective_python/file_system.html
最後に
Pythonはファイルやディレクトリ操作でも基本は1行でできるからシンプルでいいですね。Pythonについてはもっともっとブログを書きたいと思います。最後になりますが本ブログでは、Python・Linux・Node.js・フロントエンド・インフラ・Go言語・開発関連・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!






