よく使うファイル操作早引き

Pythonでよく使う便利なファイル操作のまとめ。
こういう便利な機能を使っちゃうと、C言語でツールを作るのがバカらしくなりますね。

テンポラリファイル(一時ファイル)

tempfileモジュールを使います、テンポラリファイルを作成する方法はいくつかあって、一般的にはTemporaryFile()かmkstemp()を使うと思います。


TemporaryFile()は、ファイルハンドルをクローズすると自動的にファイルが削除されます。
ファイルに同時アクセスが可能かはOS依存です、ファイルをぶろWindowsとかだと意外と使いにくいです。

import tempfile

fh = tempfile.TemporaryFile()
fh.write("test write.")
fh.close()

一方、mkstemp()はファイルハンドルをクローズしてもファイルが存在します、しかし、ユーザーの責任でファイルを削除する必要があります。

import tempfile
import os

tmp_file = tempfile.mkstemp()
#mkstemp()の戻り値は、ファイル値とファイルの絶対パス
print tmp_file

#ファイル値はfdopen()で扱う
fh = os.fdopen(tmp_file[0], "w")
fh.write("test write.")
fh.close()

#mkstemp()の場合、ユーザーが責任を持ってファイルを削除
os.remove(tmp_file[1])
ファイル同士の比較

filecmpモジュールを使えば、ファイルの比較は1行でOK。
ファイルの中身まで調べて比較してくれます。

import filecmp

filecmp.cmp(’test.txt', 'test.txt')
#=> True
filecmp.cmp(’test.txt', 'readme.txt')
#=> False

ディレクトリの比較はfilecmpモジュール配下のdircmpクラスを使います。

import filecmp

obj = filecmp.dircmp('dir1','dir2')

#比較結果をstdoutに出力
obj.report()

#dir1だけにあるファイルおよびサブディレクトリのリスト
print obj.left_only
#dir2だけにあるファイルおよびサブディレクトリのリスト
print obj.right_only

#両方のディレクトリにあるサブディレクトリのリスト
print obj.common_dirs
#両方のディレクトリにあるファイルのリスト
print obj.common_files
#両方のディレクトリにあり、一致するファイルリスト
print obj.same_files
#両方のディレクトリにあり、一致しないファイルリスト
print obj.diff_files
高レベルなファイル操作

shutilモジュールでデレクトリを再帰的にコピー&削除&移動をしてくれます。

import shutil

#ディレクトリを再帰的にコピー
shutil.copytree("src_dir", "dst_dir")

#ディレクトリを再帰的に削除
shutil.rmtree("src_dir")

#ディレクトリを再帰的に移動
shutil.move("src_dir", "dst_dir")
ファイルリストをワイルドカードでフィルタリング

fnmatchモジュールで、ファイルリストをフィルタリングすることができます。

import fnmatch
 
a = ["test.txt","test.py","test.png","foo.txt"]

#ファイルリストをフィルタリング
fnmatch.filter(a,"*.txt")    #=>['test.txt', 'foo.txt']

#単一のファイルを判断
fnmatch.fnmatch("test.txt", "*.txt")  #=>True

#大文字、小文字を判断する場合はfnmatchcase
fnmatch.fnmatchcase("test.TXT", "*.txt")  #=>False