Python ファイル操作

Python学習【365日チャレンジ!】96日目のマスターU(@Udemy11)です。

私は、映画を見るのが大好きで、U-NEXTやAmazonプライムを使って過去の映画を見まくっていますが、そろそろ面白そうな映画がなくなってきました。
もちろん、最新の映画は別料金で見ることができるのですが、なかなか追加料金を払ってまで観ようと思える映画がないんですよね。

そんな中、最近見た映画では、ネットでも話題になっている、まるで現状を予測していたかのような映画「コンテイジョン(CONTAGION)」がなかなかリアリティーがあって、見ごたえがありました。
レンタルが199円だったので、格安で観ることができますし、現状イチオシの映画です。

コンテイジョン contagion

また、5月29日には、漫画で有名な【キングダム】の実写版映画が地上波初ノーカットで放送されます。

キングダム kingdum

Amazonプライムでは有料だったので、そこまで興味がなくて観てませんでしたが、地上波で放送されるので、予定に入れておこうと思います。

この機会に映画を観まくるってのもおすすめですよ!

それではさっそくPython学習をはじめましょう!

昨日の復習

昨日は、CSVファイルへの書き出しと読み込みについて学習しました。

テキストファイル同様に、withステートメントを使って書き込み読み込みが可能でした。

import csv

with open('test.csv', 'w') as csv_file:
    fieldnames = ['Name', 'Number']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'Name': 'A', 'Number': 1})
    writer.writerow({'Name': 'B', 'Number': 2})

with open('test.csv', 'r') as csv_file:
    reader = csv.DictReader(csv_file)
    for row in reader:
        print(row['Name'], row['Number'])

出力結果

A 1
B 2

このコードから、9行目、10行目を削除して、3行目のモードをw+にすればどうなるんだろうと思って試してみました。

書き込み・読み込みモードなので、普通に同じ結果が出力されると思いますが、実際に試して結果を確認してみてください。

CSVファイルの扱いについては、昨日の記事で解説しています。

今日は、ファイルの操作方法について学習します。

osライブラリ

osライブラリは、「雑多なオペレーティングシステムインターフェイス」で、OSに依存する様々な機能を利用することができるライブラリなので、Pythonにとってかなり重要なライブラリと言えます。

osライブラリには、モジュールはたくさん用意されていますが、その中でも使用頻度の高いモジュールと関数を学習していきましょう。

os.path()

os.path()モジュールは、共通のパス名を操作するモジュールで、現時点で30の関数が実装されています。

その中でも、使用頻度の高い3つの関数を紹介します。

os.path.exists()

os.path.exists()は、指定したファイルが存在するかどうかを確認する関数です。

import os

print(os.path.exists('test.txt'))
# 作業中の階層に【test.txt】が存在する場合はTrue、存在しない場合はFalseを出力

ファイルが存在するかどうかを確認するための関数ですが、条件分岐などで使うことが考えられます。

os.path.isfile()

os.path.isfile()は指定したものがファイルであるかどうかを判断する関数です。

import os

print(os.path.isfile('test.txt'))
# 作業中の階層の【test.txt】がファイルの場合はTrue、ファイルではない場合はFalseを出力

ちなみに、ファイルが存在しない場合もFalseを返して出力ます。

os.path.isdir()

os.path.isdir()は、指定したものがディレクトリかどうかを判断する関数です。

import os

print(os.path.isdir('test'))
# 作業中の階層の【test】がディレクトリの場合はTrue、ディレクトリ出ない場合はFalseを出力

isfile同様に、フォルダが存在しない場合もFalseを返して出力ます。

続けて、他のモジュールを紹介します。

os.getcwd()

os.getcwd()モジュールは、現在の作業ディレクトリを返してくれます。

import os

print(os.getcwd())

出力結果

/private/var/mobile/Containers/Shared/AppGroup/BA3519D5-E394-4ECC-BFF6-B1898736D34A/Pythonista3/Documents/Mypython

Pythonistaで、Mypythonというフォルダに作成した【day0516.py】というファイルで実行しているので、上記のようなディレクトリが返されています。

os.rename()

os.rename()モジュールは、その名のとおり、ファイル名を変更します。

第1引数に存在するファイルの名前を指定して、第2引数に新しい名前を指定します。

import os

os.rename('test.txt', 'new.txt')

存在する【test.txt】を【new.txt】に変更していますが、ファイルが存在しなければFileNotFoundErrorが返されます。

また、名前に拡張子をつけ忘れたり、もとのファイルの拡張子を変更した場合は、ファイルが開けなくなることがあるので、注意が必要です。

os.symlink()

os.symlink()モジュールは、Macでいうところのエイリアス、Windowsで言うところのショートカットを作るモジュールです。

第1引数に存在するファイルの名前を指定して、第2引数にsymlinkの名前を指定します。

import os

os.symlink('test.txt', 'test_symlink.txt')

存在する【test.txt】とリンクした【test_symlink.txt】を作成していますが、os.renameと同様に、ファイルが存在しなければFileNotFoundErrorが返されます。

os.renameと同様、名前に拡張子をつけ忘れたり、もとのファイルの拡張子を変更した場合は、ファイルが開けなくなることがあるので、注意しておきましょう。

os.mkdir()

os.mkdir()モジュールは、ディレクトリ(フォルダ)を作成するモジュールです。

引数に作成するディレクトリの名前を指定します。

import os

os.mkdir('test_dir')

作業中の階層に引数で指定したディレクトリが作成されます。

os.rmdir()

os.rmdir()モジュールは、ディレクトリ(フォルダ)を削除するモジュールです。

引数に作成するディレクトリの名前を指定して削除します。

import os

os.rmdir('test_dir')

作業中の階層に引数で指定したディレクトリが存在し、かつ中身に何も存在しない場合は、そのディレクトリが削除されます。

ディレクトリが存在しない場合は、FileNotFoundError、ディレクトリになにかファイルが存在する場合はOSErrorが返されます。

os.remove()

os.remove()モジュールは、指定したファイルを削除するモジュールです。

引数に作成するファイル名を指定して削除します。

import os

os.remove('test.txt')

作業中の階層に引数で指定したファイルが存在すれば、そのファイルが削除されます。

ファイルが存在しない場合は、FileNotFoundErrorが返されます。

os.listdir()

os.listdir()モジュールは、指定したディレクトリの中のファイルをリストにするモジュールです。

フォルダ構造

Mypython ┳ day0516.py
         ┗ package ┳ __int__.py
                    ┣ test.py
                    ┣ test.txt
                    ┗ test2.py

上記のようなフォルダ構造の状態で、引数にpackageを代入してみます。

import os

print(os.listdir('package'))

出力結果

['__init__.py', 'test.py', 'test.txt', 'test2.py']

存在するファイルがリストになって出力されます。

他のモジュール同様に、指定したディレクトリが存在しない場合は、FileNotFoundErrorが返されます。

osライブラリに関しては、これらのモジュールの使用頻度が高く、他のモジュールについては、必要に応じて公式ドキュメントを参照するようにしましょう。

pathlibライブラリ

続いて学習するのは、pathlibライブラリです。

こちらは、「オブジェクト指向のファイルシステムパス」ということで、全く意味がわかりません。

最近気づいたのですが、ライブラリのあとに続く文字が大文字で始まるときは、クラスになっているようです。

つまり、今回学習するpathlib.Path().touch()は、pathlibライブラリのPathクラスのtouchモジュールということになります。

このtouchモジュールは、openモジュール同様に、ファイルを作成できるのですが、先日学習したwithステートメントを使い、openモジュールの書き込みモードでファイルを作成するよりも簡単にファイルを作成することができます。

import pathlib

pathlib.Path('test.txt').touch()

注意しなければならないのは、openメソッドの書き込みモードと同様に、作業中の階層に、同じ名前のファイルが存在する場合は、上書きしてしまうため、中身のあるファイルは空のファイルに書き換えられてしまいます。

globライブラリ

globライブラリは「Unix形式のパス名のパターン展開」ということで、なんとなくわからなくもないのですが、よくわからないというのが本音です。

意味がわからなくても、実行してみるとどんなことができるかわかるので、とりあえず実行してみましょう!

下記のようなフォルダ構造の中で、【day0516.py】にコードを記述しています。

フォルダ構造

Mypython ┳ day0516.py
         ┗ package ┳ __int__.py
                    ┣ test.py
                    ┣ test.txt
                    ┗ test2.py

day0516.py

import glob

print(glob.glob('package/*'))

出力結果

['package/__init__.py',
 'package/test.py',
 'package/test.txt',
 'package/test2.py']

os.listdir()と同じような役割ですが、ファイル名だけでなく、作業階層からのパスを含めて出力しています。

*(アスタリスク)をつけることで、指定したディレクトリの中のファイルすべてを指定することになります。

shutilライブラリ

本日最後のライブラリはshutilライブラリで、「高水準のファイル操作」とされています。

名前からしてちょっと扱うのが難しそうですが、扱い方を注意しないとえらいことになってしまうので、注意して扱うようにしましょう。

shutil.copy()

import shutil

shutil.copy('test.txt', 'test2.txt')

第1引数に、存在するファイル名、第2引数にコピーしたファイルの名前を入れます。

存在しないファイルを指定すると、他のメソッド同様に、FileNotFoundErrorが返されます。

また、第2引数に指定したファイル名と同じファイルが存在する場合は、openモジュールやtouchモジュール同様に、上書きされてしまうので、注意しましょう。

shutil.rmtree()

import shutil

shutil.rmtree('package')

作業ファイルと同じ階層のpackageディレクトリを丸ごと削除します。

指定したディレクトリが存在しない場合は、FileNotFoundErrorが返されますが、かなり強力なメソッドで、間違って使ってしまうと、今まで作ったファイルをすべて削除してしまうため、このshutil.rmtreeを使うときは、かなり注意して使うようにしましょう。

もちろん、他のremovermが関係しているメソッドを使うときも、すぐに削除されるので、使用するときは注意しなくてはいけません。

MacやWindows上で操作する場合は、ファイルを削除しても、ゴミ箱に移動しているだけなので復活させることができますが、これらのメソッドを使って削除してしまうと、もとに戻すことができませんので、細心の注意を払って使うようにしましょう。

便利なライブラリがいっぱい

ということで、今日はかなりたくさんのライブラリを学習しましたが、Pythonには、便利なライブラリがたくさん用意されています。

かといって、すべてのライブラリの使い方を憶えておく必要はなく、こんな使い方できるライブラリが無いかなと思ったときに、Googleで検索してみるとピッタリの使い方ができるライブラリが見つかります。

今日学習したライブラリは、比較的使用頻度が高いということなので、頭の片隅に置いとくか、実際にプログラムを書き始めて使うようになれば、自然と憶えていくと思います。

基本的な作業は、複雑な作業のもとになるものなので、しっかりと復習して頭に入れておきましょう。

それでは、明日もGood Python!