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.

電子書籍をオンライン管理する

はじめに 最近,書籍を電子版で購入することが増えたことで電子書籍の管理が煩雑になってきました. 多くの場合,電子書籍を購入すると販売サイトから書籍データをダウンロードできて, それらを自分の端末に入れて読むことになります.また,一つの書籍に対してPDFやEPUB など複数のフォーマットが用意されていることも多いです.本を購入するたびに増えていく ファイルを効率よく管理するために,先日Bookshelf という電子書籍管理のためのWEBアプリをつくりました. これまでは電子書籍の管理のためにDropboxやGoogle Driveなどのクラウドストレージに ファイルを突っ込んでいたのですが,ファイルへのアクセスが面倒であったり, ストレージの容量を気にする必要があったりと不満を感じていました. Bookshelfにはこうした問題を解決するための 機能を実装しました. Bookshelf Bookshelfは電子書籍を管理するための WEBアプリであり,フロントエンドはVue.js + TypeScript, バックエンドはGo言語で 実装されています.主な特徴は以下のとおりです: 書籍情報の登録 OPDSフィードの配信 複数フォーマットの登録 S3互換ストレージへの保存 シングルバイナリ 書籍のメタ情報はPostgresかSQLite3に,書籍ファイルはローカルのファイルシステムか S3互換のオブジェクトストレージに保存することができます.また,本やファイルの 追加や削除はすべてブラウザから行えます. 書籍情報の登録 Bookshelfでは書籍データを保存する際に 著者や出版社,表紙などの書籍情報を合わせて登録します.書籍情報を登録する際は ISBNを入力すると自動的に他のフィールドを補完するため,効率よく書籍を登録する ことができます.登録された書籍情報は書籍へのアクセスの利便性を上げるだけでなく, 後述するOPDSフィードの配信にも使われます. ISBNによる補完にはopenBDという検索APIを利用しています. 主要な書籍の情報はだいたい揃っていて,APIの仕様も簡潔なため非常に使いやすいです. OPDSフィードの配信 電子書籍を配信するための規格としてOPDSというのがあるようです. あまり流行ってはいなさそうですが,日本ではオライリー・ジャパンや 青空文庫などでOPDSによるカタログの配信が行われて います.Bookshelfは登録した書籍をOPDSフォーマットで配信することができます. OPDSフィードへのリンクはヘッダー右側のアイコンから取得できます. OPDSに対応したリーダーであれば,このアプリに登録した書籍をPCやスマートフォン から読むことができます.例えばFoliate というソフトウェアを使うと以下のように書籍の一覧を眺めたりファイルを ダウンロードしたりできます.このOPDS配信機能とOPDS対応リーダーのおかげで本への アクセスやローカルでの管理がかなり便利になりました. 複数フォーマットの登録 Bookshelfでは一つの書籍についてPDFやEPUBなど複数のフォーマットのファイルを 登録できます.ブラウザからは以下のように登録したファイルがアイコンとして表示 され,クリックするとファイルをダウンロードすることができます. またOPDSでも複数のフォーマットを配信しているため,例えばFoliateからは以下の ようにプルダウンメニューからフォーマットを選択してダウンロードすることができます. S3互換ストレージへの保存 書籍ファイルの保存先をS3互換のオブジェクトストレージに設定することができます. S3互換のストレージには本家のAWS S3やオープンソースのMinIO などがありますが,私はwasabiを使っています.wasabiは AWS S3に比べて非常にコスパがよく,API呼び出しや転送に対して課金されないため重宝 しています.(1TB未満なら$6/mo程度です.) これで容量をほとんど気にすることなく 電子書籍を管理できます! シングルバイナリ Bookshelfはシングルバイナリで動作するアプリケーションです.今回,フロントエンド をバイナリファイルに含めるためにgo-bindata-assetfs を使ってみました.これを使うと任意のファイルをGoのコード中にバイナリとして埋め込む ことができます. 埋め込んだファイルは以下のようにhttp.