WebやS3上のファイルにアクセスするためのPythonライブラリ
はじめに
Web上やAWS S3上のファイルへのアクセスを簡単にするために Minato というPythonライブラリの開発を行っています. Minatoの機能は大きく以下の3つです:
- オンラインファイルに対する読み書き
- オンラインファイルのローカルへのキャッシュ
- ローカルのキャッシュファイルの管理
この記事ではこれらの機能と Minato の基本的な使い方について紹介します.
ファイルの読み書き
Minatoを使うことで,通常のPythonでのローカルファイルへの読み書きと同じような手順でオンラインのファイルにアクセスすることができます. 次の例からわかるように,MinatoはURLのスキームから適切なファイルシステムを自動的に選択して使用します.
import minato
# Web上のファイルの読み込み
with minato.open("http://example.com/path/to/file", "r") as f:
content = f.read()
# S3上のファイルへの書き込み
with minato.open("s3://your_bucket/path/to/file", "w") as f:
f.write("Create a new file on AWS S3!")
# ローカルのファイルへの書き込み
with minato.open("/path/to/local/file", "w") as f:
f.write("Create a new file on a local storage!")
キャッシュの利用
Web上の大きなデータを読む場合に,ローカルにキャッシュを置くことで何度もファイルをダウンロードすることなくアクセスすることができます.
Minatoでは cached_path
というメソッドを使うことでURLからローカルのキャッシュへのパスを取得できます.
キャッシュが存在していない場合は指定したURLのファイルが自動的にダウンロードされます.
import minato
local_path = minato.cached_path("https://example.com/path/to/large/file")
with open(local_path) as fp:
content = fp.read()
キャッシュにアクセスする際は排他ロックを行うため,複数のプロセスから同時にアクセスがあっても問題なく動作します. たとえは,プロセスAがキャッシュのダウンロードを行っているタイミングで別のプロセスBが同じキャッシュにアクセスした場合, プロセスBはプロセスAがダウンロードを完了するまで待機します.プロセスAがロックを解除した時点でキャッシュファイルが生成されているので,プロセスBは同じリソースをダウンロードすることなくキャッシュを利用できます.
また,ZIP形式などのアーカイブファイルの中身に直接アクセスすることもできます.
以下のようにアーカイブファイル名の後ろに !
を含めると,そのファイルを展開します.
更にその後ろにアーカイブファイル内のパスを加えると,アーカイブファイルの中身を直接取得できます.
filename = minato.cached_path("https://example.com/path/to/archive.zip!inner/path/to/file.txt")
キャッシュの管理
Minatoにはダウンロードされたキャッシュを管理するためのCLIが実装されています. このCLIを使って,キャッシュされているファイルの確認や,キャッシュの追加,削除,更新などを行うことができます.
# キャッシュの一覧表示
$ minato list
id url size
== ======================================= =========
1 https://example.com/path/to/large/file1 512.0 MiB
2 https://example.com/path/to/large/file2 1.1 GiB
# キャッシュの削除
$ minato remove 1
1 files will be deleted:
[1] https://example.com/path/to/large/file1
Delete these caches? y/[n]: y
Cache files were successfully deleted.
# ファイルの再ダウンロード
$ minato update 2
1 files will be updated:
[2] https://example.com/path/to/large/file2
Update these caches? y/[n]: y
Cache files were successfully updated.
おわりに
オンラインのファイルにアクセスするためのPythonライブラリ Minato を紹介しました. Minatoは,現在開発中の pdpcli や automlcli におけるオンラインリソースへの読み書き機能を切り出して共通化する目的で開発を始めました. 今後はこれらのライブラリにMinatoを利用しつつ改善を進めていく予定です.
comments powered by Disqus