Pythonを使ってフォルダ、ファイル操作
Pythonを使って業務を効率化するためには、フォルダ、ファイル操作に使用するライブラリ、モジュール、メソッドを理解しておく必要があります。本文書を読んだだけでは業務効率化のプログラムは作成できませんが、作成するためにベースとなるフォルダ、ファイルを操作するための基本を確認していきます。
フォルダ操作
フォルダの作成
osモジュールを使ってフォルダの作成を行うためにはos.mkdirメソッドを使います。
os.makedir(パス)
import os
os.mkdir("test")
実行するとpyファイルが存在するフォルダにtestフォルダが作成されます。
再度実行すると下記のFileExistsErrorエラーが発生します。
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: ‘./test’
また存在しないフォルダの下にフォルダを作成しようとするとFileNotFoundErrorエラーが発生します。その場合は、sub_folderフォルダを事前に作成してください。
FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: './sub_folder/test'
フォルダの存在確認
パスに指定したフォルダが存在するかどうか確認したい時は、os.path.existsメソッドを利用することができます。
os.path.exists(パス)
import os
print(os.path.exits('test'))
指定したパスにフォルダが存在する場合は、Trueが戻されます。存在しない場合にはFalseが戻されます。
フォルダを作成する際にパスに指定したフォルダが存在するかどうか確認を行っておくことで FileExistsError エラーの発生を防ぐことができます。フォルダが存在する場合はos.mkdirメソッドが実行されないためです。
import os
if not os.path.exists('test') :
os.mkdir("test")
フォルダかどうか確認
指定したパスがフォルダかどうか確認する時はos.path.isdirメソッドを利用することができます。
os.path.isdir(パス)
指定したパスのtestがpyファイルが存在するフォルダ内にあるフォルダかどうか確認を行います。
import os
print(os.path.isdir('test'))
指定したパスがフォルダである場合は、Trueが戻されます。フォルダでない場合はFalseが戻されます。指定したパスがファイルの場合もFalseが戻されます。
フォルダを作成する際にパスに指定した値がフォルダかどうか確認を行うことで FileExistsError エラーが発生することがなくなります。 フォルダだった場合はos.mkdirメソッドが実行されないためです。
import os
if not os.path.isdir('test') :
os.mkdir("test")
フォルダを削除する(空のフォルダ)
フォルダが空の場合はos.rmdirメソッドを使用することができます。
os.rmdir(パス)
testフォルダの中身が空の場合は下記を実行するとtestフォルダが削除されます。
import os
os.rmdir("test")
もしフォルダが空でない場合は下記のOSErrorエラーが発生します。
OSError: [WinError 145] ディレクトリが空ではありません。: 'test'
存在しないフォルダを削除しようとした場合は下記のFileNotFoundErrorエラーが発生します。
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。: 'test2'
中身のあるフォルダを削除(空でない)
os.rmdirでは空のフォルダしか削除することはできませんでした。osモジュールには、中身のあるフォルダを削除するメソッドはないので、osモジュールとは別のshutilモジュールを使用する必要があります。
shutil.rmtree(パス)
import shutil
shutil.rmtree("test")
実行するとtestフォルダとその中にあるファイルが削除されます。もしtestフォルダの中にさらに別のフォルダがある場合もrmtreeでは一緒に削除されます。つまり、指定したフォルダ以下のデータがすべて削除されます。
パスに指定したフォルダが存在しない場合は、os.rmdirと同様にFileNotFoundErrorエラーが発生します。
フォルダの複製(コピー)
shutil.copyメソッドを使ってフォルダのコピーを行うことができます。
shutil.copytree(コピー元のパス、コピー先のパス)
pyファイルがあるフォルダにtestフォルダが存在し、そのフォルダをtest2という名前でコピーを行います。
import shutil
shutil.copytree('test', 'test2')
test2がすでに存在している場合は下記のFileExistsErrorエラーが発生します。
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: 'test2'
コピー元のフォルダが存在しない場合は、FileNotFoundErrorエラーが発生します。
フォルダの移動
フォルダを移動したい場合は、shutil.moveメソッドを使ってフォルダの移動を行うことができます。
shutil.move(移動元のパス、移動先のパス)
pyファイルがあるフォルダに存在するtestフォルダを同じ階層にあるfolder1の下に移動します。
import shutil
shutil.move('test', 'folder1')
フォルダtestの下にファイルやフォルダがある場合はそれらのファイルとフォルダも一緒に移動されます。
フォルダ名の変更
フォルダの名前を変更したい場合は、os.renameメソッドを使ってフォルダの名前を変更することができます。
os.rename(変更前のフォルダ名、変更後のフォルダ名)
pyファイルがあるフォルダに存在するtestフォルダの名前をtest2に変更します。
import os
os.rename('test', 'test2')
すでにtest2フォルダが存在している場合は、下記のFileExistsErrorエラーが表示されます。
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: 'test' -> 'test2'
ファイル操作
フォルダ内のファイル、フォルダ一覧
フォルダの内のファイル一覧(フォルダも含む)を取得したい場合はos.listdirメソッドを使用します。
os.listdir(パス)
pyファイルがあるフォルダに存在するtestフォルダ内のファイル一覧を取得します。
import os
lists = os.listdir('test')
for list in lists:
print(list)
実行するとファイル名とフォルダ名の一覧が表示されます。
<py test.py
1.pdf
2.pdf
test2
test3
ファイルかどうかの確認
指定したパスがファイルかどうか確認する時はos.path.isfileメソッドを使って行うことができます。
os.isfile(パス)
指定したパスのtest.txtがpyファイルが存在するフォルダ内にあるファイルかどうか確認を行います。
import os
print(os.path.isfile('test.txt'))
指定したパスがファイルである場合は、Trueが戻されます。指定したパスがファイルでない場合はFalseが戻されます。
パスを連結する
os.path.joinメソッドを使うとパスの連結を行うことができます。
フォルダ内のファイル一覧のみ表示
os.listdirとos.isfileメソッドを組み合わせることでファイル一覧のみ表示させることができます。testフォルダの中のファイルとフォルダはos.path.joinを利用してパス設定します。
import os
lists = os.listdir('test')
for list in lists:
if os.path.isfile(os.path.join('test',list)):
print(list)
実行するとファイルの一覧のみ表示されます。
>py test.py
1.pdf
2.pdf
フォルダ内のフォルダ一覧のみ表示
先ほどはファイル一覧のみ取得しましたが、os.path.isfileをos.path.isdirメソッドに変更するだけでフォルダのみ表示することができます。
import os
lists = os.listdir('test')
for list in lists:
if os.path.isdir(os.path.join('test',list)):
print(list)
>py test.py
test2
test3
ファイルの存在確認
パスに指定したファイルが存在するかどうか確認する際os.path.existsメソッドを利用することができます。フォルダも同じメソッドで存在確認を行います。
os.path.exists(パス)
import os
print(os.path.exits('test.txt'))
ファイルが存在する場合は、Trueが戻されます。ファイルが存在しない場合はFalseが戻されます。
ファイルを作成する
ファイルを作成する場合はopen関数を使って行います。open関数ではファイル名の後に書き込みモードを表すwを指定します。
open(ファイルパス,’w’)
f = open('test.txt','w')
f.write('これは1行目です')
f.close()
pyファイルを実行したフォルダにtest.txtが作成されメモ帳で開くと下記のようになります。
ファイルが存在してもそのまま新規で新しいファイルとして作成されるため内容は上書きされます。
ファイル作成で文字化け
Windowsでファイルを作成すると文字コードはShift-JISのため、UTF8がデフォルトのアプリケーションでは文字化けが発生します。その場合はopen関数でencodingでutf-8を指定します。
f = open(‘test.txt’,’w’,encoding=’utf-8′)
ファイルに追記する
ファイルに追記したい場合もopen関数を使って行います。作成の時はモードをwにしましたが、追記の場合はaを指定します。
open(ファイルパス,’a’)
実行すると追記はされましたが、2行目に追加されるのではなく1行目の後ろに追加されていることがわかります。これは作成時1行目を書き込んだ際に改行コードがついていなかったためです。
1行目に下記のように改行コード(\n)をつけて実行すれば2行目は改行して表示されます。
f = open('test.txt','w')
f.write('これは1行目です。\n')
f.close()
ファイルを削除する
os.removeメソッドを使用するとファイルを削除することができます。
os.remove(パス)
import os
os.remove('test.txt')
実行するとpyファイルが存在するtest.txtファイルが削除されます。 ファイルが存在しない場合は、FileNotFoundErrorエラーが発生します。
ファイル名を名前と拡張子にわける
test.csvという名前のファイルがある場合、拡張子のcsvと名前のtestにわけたい場合があります。その場合は、os.path.splitext(ファイルパス)を使うことができます。
test.csvというcsvファイルを下記のコードを使って名前と拡張子にわけます。
import os
name_extention = os.path.splitext('test.csv')
print(name_extention)
実行結果は下記のようにタプルで取得できます。
('test', '.csv')
名前だけを取得したい場合はname_extention[0]で取得可能です。また、下記のように取得することもできます。
import os
(name, extention) = os.path.splitext('test.csv')
print(name)
パスからファイル名のみ取り出す
フォルダとファイル名が混在しているパスからファイル名を取り出す時は、os.path.basenameメソッドを利用します。
import os
path = 'python/work/test.py'
print(os.path.basename(path))
実行するとファイル名test.pyのみ取得することができます。
パスからフォルダ名のみ取り出す
フォルダとファイル名が混在しているパスからフォルダを取り出す時は、os.path.dirnameメソッドを利用します。
import os
path = 'python/work/test.py'
print(os.path.dirname(path))
実行するとpython/workのみ取得することができます。