こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。
実践試験Tipsは、当協会のPython3エンジニア認定実践試験を受験される予定の方に向けて、何回かに分けてちょっとした情報をお伝えしていく目的で作成しています。
前回は主教材Chapter9 データ型についてお話しました。
今回はChapter10汎用OS・ランタイムサービスと、Chapter11ファイルとディレクトリへのアクセスについて学習のポイントを解説します。
■学習のポイント:Chapter10汎用OS・ランタイムサービス、Chapter11ファイルとディレクトリへのアクセス
Python3エンジニア認定実践試験は、主教材「Python実践レシピ」(技術評論社)の中から出題されます。
出題範囲については以下のページをご確認ください。
主教材Chapter 10は汎用OS・ランタイムサービス、Chapter11ではファイルとディレクトリへのアクセスが説明されています。
Chapter10とChapter11からはそれぞれ2問ずつ(5%)が出題されます。
基本的なPythonの使い方を知っている方であれば、どちらもそう難しくない章だと思いますので、取りこぼしがないようにしてください。
■押さえておきたいポイント
それぞれの章の押さえておいてほしいポイントを説明していきます。
Chapter10. 汎用OS・ランタイムサービス
10章は比較的基礎に近い内容のおさらいになっているかなと思いますので、Pythonを使い慣れている方からすると、理解しやすい部分だと思います。
10.1 OSの機能を利用する-OS
OSの機能を利用するosモジュールは、WindowsやmacOS、LinuxなどのOSに対して、何らかの指示をする際に利用されます。基本的にはこのosモジュールだけでもos自体の様々な機能を吸収して、Pythonからひとつのコマンドで使えるようにできます。ただ、一部の環境では使えないものもある場合がありますので、注意が必要です。
osモジュールを利用してよく行うとすればファイルの操作なのではないかと思います。私自身もos.path.join()やos.getcwd()などを比較的よく利用します。ただ、これらに関しては、後ほどお話しする11章のpathlibのほうがPythonの実装としては重点がおかれています。とはいえ、osモジュールでできることも残ってはいますので、pathlibが開発現場で主流使われるとはいえ、機能自体は押さえておく必要はあります。
osモジュールでは、環境変数の取得・操作やプロセス管理などの機能を利用できます。
また、ファイルやディレクトリの操作については、近年は pathlib モジュールを利用する機会が増えています。そのため、osモジュールにもこうした機能があることを把握しておく程度でよいでしょう。また、さまざまな情報へのアクセスやランダム文字列の生成といった機能もあるため、必要に応じて参考にしてください。
10.2 ストリームを扱う—io
普段ファイルとして扱っているものを、組み込み関数のopen()でテキストファイルを開くと、ファイルオブジェクトが作成されます。このファイルオブジェクトに対してread()で読み込み、write()で書き込みを行います。これはPythonの標準機能として入っているものですが、この節でいうioとはFile-like objectをメモリ上に作るものだと考えてください。
なぜこういったものがあるのかというと、例えば画像を変換するPillowライブラリは、バイナリーデータなどの実際の生のデータを扱うのではなく、File-like objectを要求するということがよくあります。
例えば、Webを経由してアップロードされてきたファイルがあったときに、アップロードされてくるのはストリームとしてhttp通信を通じてサーバーサイドにやってきます。そうしてきたデータがストリーム情報としてPythonのオブジェクトとしてわたります。この場合、PillowとしてはFile-like objectを要求しているのですが、受け渡されるデータがFile-like objectになっていないため、受け渡されたデータをそのままではPillowに渡しにくい場合があります。そこで、ioライブラリを使うと、メモリの中でFile-like objectを作り、Pillowのインターフェースに直接渡せるようになります。こういったシーンはWebの世界ではよくあることです。
もしこれができないとなると、どこかに一度実際のファイルとして書き出し、そのファイルをopen()して処理をしなくてはなりませんので、とても不便です。
File-like objectを要求してくるのはPillowだけではありません。もし必要となったときには、ストリームできた情報を直接ファイルのように扱えるioライブラリを思い出してください。
ioモジュールには、大きく分けてStringIOとBytesIOの2種類があります。
画像データのようなバイト列を扱う場合はBytesIOを使用し、テキストファイルのように文字列を扱う場合はStringIOを使用します。
このように、文字列(str)を扱うのか、バイト列(bytes)を扱うのかによって使い分ける必要があります。Python 3ではstrとbytesが明確に区別されているため、この使い分けは非常に重要です。
書籍でも紹介されている通り、こういったものはユニットテストなどで仮のFile-like objectを作りたいというような場面でよく利用される技術だと思います。
10.3 インタープリターに関わる情報を取得、操作する—sys
sysモジュールを使う機会はそんなにはないかもしれませんが、システム関係のものとして、sys.argvを使います。
スクリプトモードでPythonを動かした時の引数を取るときや、importを内部的に制御しているのがこのsysモジュールです。sysモジュールにはさまざまな機能がありますが、まずは「システム関連の情報を扱うモジュール」であり、Pythonのバージョン確認などにも利用できることを押さえておけばいいかと思います。
10.4 コマンドラインオプション、引数を扱う—argparse
argparseは標準ライブラリに入っているものの1つで、先ほどのsys.argvで取得できるコマンドライン引数を扱う際に利用します。
例えば sample.py というスクリプトを実行するときに、その後ろにファイル名などの引数を指定して処理を行うことがあります。
argparseを使うと、コマンドライン引数だけでなく、オプションの定義やヘルプメッセージの表示なども簡単に実装できます。コマンドラインツールを作成する際によく利用されるため、ぜひ覚えておくといいと思います。
Chapter11. ファイルとディレクトリへのアクセス
11.1 ファイルパス操作を直感的に行う—pathlib
Chapter10でも話がでたpathlibという標準ライブラリを使いこなすというのがこの節です。
pathlibを使うことで、パスの書き方や同じような表記の仕方がよりわかりやすくなったため、WindowsやmacOS、LinuxといったどのOSにも対応がしやすくなりました。近年はpathlibを使ったやり方が標準的になっています。
書籍では最初にpathlibのクラス構成が紹介されています。純粋パスの渡し方や具象パスの渡し方などを含め、理論的な話がされています。まずはpathlibの具象パスの使い方を覚えていただいて、こういう仕組みになっているのだということを理解してもらう流れがいいかと思います。
Pythonのコードを書く際に、パスの操作をしなければならないときには必ずpathlibを使うのだということに慣れてほしいと思います。また、pathlibを使い慣れてくれば、スラッシュ記号でパスの連結をつなげるということが簡単にできるようになります。osモジュールで書かれているものがあれば、pathlibを使ったものに書き直すくらいの勢いでpathlibを覚えてもらえればと思います。
11.2 一時的なファイルやディレクトリを生成する—tempfile
ファイルやディレクトリを操作中に一時的に生成されるのがTempファイル(temporary file)です。
先ほどosモジュールのところでわざわざファイルを別に作らずともFile-like objectが使えるという話をしましたが、このTempファイルがどうしても必要になるケースがあります。
例えば、テストコードを実行する際、やはりファイルをopen()してからテストをしたいということがあったとします。この時、ダミーのファイルを作ってわざわざ消すということをするよりも、一時的に使用するファイルやディレクトリの作成と削除を自動でしてくれるtempfileというライブラリを使ったほうが安全に行うことができます。
このライブラリは、この節の最後、よくある使い方の2番目にも書いてあるように、ファイルサイズが大きく、メモリーに入りきらないデータを一時的に保存しておくという使い方も稀にはあるかなと思います。
11.3 高レベルなファイル操作を行う—shutil
ファイルのコピーなど、再帰的にディレクトリやファイルを操作したい時に、pathlibでは少々やりづらいことがあります。そうした時に使われるのがshutilです。ツリー構造になっているものも処理できますので、使い慣れてくれば便利によく利用するようになるかと思います。
教科書を一通り読んで、実行してみてもらえれば、そう難しくはないと思います。
■さいごに
今回は、Chapter10とChapter11のポイントをまとめてお話ししました。
特に取りこぼしのないよう、実践を通じて理解を深めていってもらえればと思います。
