2017/03/25更新

[Python] ファイルやディレクトリ操作まとめ

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
今日は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の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。