読者です 読者をやめる 読者になる 読者になる

Pythonでフォルダ・ファイルを操作する(ファイル取得・フォルダ作成など)

単純作業を効率化するためにPythonを使います。フォルダ自体や、中に含まれるファイルの操作をサクサク行う寸法よ。

基本

Pythonのデフォルトライブラリで大概のことができるという。 ファイルやフォルダの操作ならosモジュールを使うと便利です。Pythonのバージョンは3.3以降を想定。

import os

osモジュールに関するオンラインドキュメントはこちら

16.1. os — 雑多なオペレーティングシステムインタフェース — Python 3.3.6 ドキュメント

フォルダ(ディレクトリ)の内容を抽出・加工する

現在の作業フォルダのパスが知りたい場合にはos.getcwdを使います。

# パス名を出力するだけの場合
os.getcwd()
# 上の書き方で行うか、もしくはPrint関数に引き渡す
print(os.getcwd())
# 組み込むなら変数に格納しておくと便利
CurrentDir = os.getcwd()

フォルダ指定する際、指定フォルダが存在するか否かを判別したい場合はpath.existsメソッドで処理を回すと便利。返り値はTrue/Falseの真偽値です。出力サンプルはiPythonコンソールで吐きだしてます。

os.path.exists('C:\\')
Out[1]: True

os.path.exists('C:\\hogehoge')
Out[2]: False

フォルダ中に含まれるフォルダ・ファイルのリストを取得したい場合はos.listdirを使います。返り値はフォルダ・ファイル名のリストです。

# 引数指定しない場合は作業フォルダのリストを返す
os.listdir()
# 指定した場合は指定フォルダのリストを返す
os.listdir('C:\\')

返り値のリストのサンプル

os.listdir()
Out[3]: ['hogehoge.txt', 'fuga.zip', 'fuga']

os.listdirを使えば一覧は取れますが、フォルダに該当するものだけ抜きたい場合や、その逆でファイルだけのリストを作りたい場合がある場合はos.path.isdirで処理を噛ませます。

os.path.isdir('C:\\')
Out[4]: True

os.path.isdirは真偽値を返すので、forで処理すると欲しいもののリストが作れます。フォルダだけの一覧が欲しい場合には以下のように書けばいいかも。

# 空のリスト(入れ物)を用意する
DirList = []
# フォルダに該当するものをDirListに加える
for i in os.listdir():
    if os.path.isdir(i):
        DirList.append(i)

if文の中を否定すればファイルだけ取れます。ただ、ファイルだけのリストを作りたいのであれば類似のメソッドでos.path.isfileというのがあるのでそっち使うほうが楽。

フォルダの移動・作成

作業フォルダ以外で処理を行いたい場合にはchdirを使います。作業を行いたいフォルダ名を引数に与えることで、スクリプトの実行環境を動かします。

例えば下記のように指定すれば、スクリプトの作業環境はCドライブ直下に移動します。

os.chdir('C://')

フォルダを作る場合はos.mkdirで作成可。これはLinuxシステムのmkdirと同じ。

os.mkdir('hoge')

これで作業中のフォルダ内にhogeフォルダができます。引数には絶対パス指定でも可。

使ったことが無いけどtempfile.mkdtempというメソッドがあるらしく、テンポラリのディレクトリを作ることができるらしい。

特定のファイルを取得する

ファイルに関する検索などなどをやろうとする場合はglobを使うと便利。使い方はosと同じようにインポートする。

import glob

globモジュールはパターンマッチングを行うものなので、フォルダのリストをとってくる場合にも使えます。 ただ、globは十徳ナイフの如く何でもできるので、フォルダリストを作りたい場合はos.listdirを使うほうが楽。

作業フォルダ内のフォルダもファイルもまとめてとる場合は以下のように記述します。

glob.glob('./*')
# パスを含まない場合
glob.glob('*')

ワイルドカードで全取得。文字列指定で拡張子を設定することで、特定のファイルのリストを作ることができます。この場合はglobが便利。

# パスを含む場合
glob.glob('./*.csv')
# パスを含まない場合
glob.glob('*.csv')

これでcsvファイルを一括取得。globは正規表現が使えるので数字と拡張子でできているファイル名だけ取得する場合は下記のように記述します。

glob.glob('[0-9].*')

ファイルの取得はglobのが便利です。

ここまでを便利に使えばスクリプトにファイルの整理を任せることができそう。機械の仕事は奪わない。