2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iCloudの画像整理バッチ (1)iniファイルにローカル設定を書こう

2
Last updated at Posted at 2018-03-12

iCloudの画像整理バッチ (1)iniファイルにローカル設定を書こう

経緯・理由

  • PCのCドライブのときのように、iCloudもゲームのスクショ画像などで埋まり始めた
  • ただ、正直なところ、お気に入りの画像以外はそんなに見ない
  • 時々iOSアプリのWorkflowで簡易的にzipファイルを作って転送させようと試みるも、zip化に失敗して闇へと消えていく画像が多数
  • 「せめてローカルのDドライブにあれば十分だな……」ということで、今回のバッチ制作にとりかかることに
    • これまでは、いろいろ詰め込んで読みにくかったので、機能ごとに分割して連載します

目的・実装予定の機能

目的

  • iCloudの同期フォルダはCドライブにあるので、Dドライブに作成済みのアーカイブフォルダへ移動する
  • 移動の際、zipファイルとして保管する
  • また、zipファイルの中身のサムネイルとして、GIFアニメーションを同時に作成する
  • ログはcsvファイルに書き出す(処理のエラー等はlogging等を検討、選定中)1

機能

目次用記事を立てました→こちら

<< 最初の記事 | < 前の連載記事 | 次の連載記事 > 2

(※免責:上記の順番は記事の順番とは一致しない可能性が高いです。あらかじめご了承下さい)

今回の機能の解説

  • iniファイルという、簡易的な、テキストベースの設定ファイルを利用する
    • xmlファイルなら細かい設定も可能だが、2つのキーで1つの値を取得するだけならこれでも良い
  • iniファイルの読み込みだけなら、通常のファイル読み込みでも可
    • 値の呼び出しを可能にするにはconfigparserモジュールを利用する

ソースコード

【準備】iniファイルの中身(執筆時点)

for-iCLoud-template.ini
[settings]
input=C:/Users/**your_user_name**/Pictures/iCloud Photos/Downloads
output=D:/ピクチャ/iCloudバックアップ
size_mb=500

[picture]
backup=backup
gif=gif
dulation_ms=500
thumb_px=750

[log]
logging=log/log/
csv=log/csv/

[API]
rollbar=xxxxxxxx (配布分は空欄の予定)

解説

  • []内が「セクション」そこに属するブロックの各行が「オプション」です
  • input側のiCloudフォルダは、ユーザー名(PC名)を置き換えれば、標準では大体このパスになるはずです
  • mainメソッドの解説で書きますが、os.pathだと空白パスに弱いです(たしか)3が、pathlibモジュールはこの問題をカバーしてくれます
  • outputは自由に設定して問題ないと思います
  • Rollbarというloggingサービスを使おうと思っています
    • (補足)[APIのトークンをコードに書いている人へ - Qiita]
    • iniファイルにAPIトークンなんかも書けますが、上記の記事のように環境変数や、記入したiniファイルを.gitignoreに入れるなどしないと不正アクセスの元なので要注意
    • 表向きにはloggingモジュールで取れるようにしておこうと思います。両方をラップするクラスが必要そうなので準備します。

GitHubに設定ファイルのテンプレートを公開中

【入力】iniファイルからの読み込みメソッド

get_ini_data
# iniファイルから色々読み込む 
def get_ini_data(path_obj): 
	ini_file = configparser.SafeConfigParser() 

	with path_obj.open('r', encoding=file_attr.get_enc('r')) as ini_file_obj:		 
		ini_file.read_file(ini_file_obj) 

	return ini_file 

解説

  • configparserモジュールで、iniファイルを読み込む(重要)
  • 今回も、パスの扱いがやりやすいpathlibモジュールを導入
  • with構文で、読み出し部分のみの扱いにできる
    • file_attr.get_enc('r')以前作ったものをファイル管理用のクラスに流用
    • 詳細は次回~次々回あたりに
  • あとは、読み出しした中身のオブジェクトを返り値にすればOK

【出力】iniファイルの中身の取り出し方(mainメソッド)

main
	# 古いファイルを特定する(1年以上前なら1GBまで) 
	input_dir = Path(ini_data['settings']['input']) 
	output_dir = Path(ini_data['settings']['output']) 

解説

  • iniファイルのデータの取り出し方は以下の2種類があるそうですが、自分は後者を選びました
    • ini_data.get(section_name, option_name)
    • ini_data[section_name][option_name]
  • os.pathでは、空白入り(特にユーザーフォルダ系)のパスを取得するのに失敗します3
    • 代わりにfrom pathlib import Pathを利用すると、上手いことパスを取得してくれます

まとめ

  • 最終的にバッチ完了までの連載を行います
  • iniファイルは空白入りの文字列もOK
    • ただし、パスはpathlibを使った方が安定して使える

GitHubリンク

<< 最初の記事 | < 前の連載記事 | 次の連載記事 > 2

  1. クラウドロギングサービスのライブラリとloggingとの切り替えがしたいですね

  2. Qiita運営さん、Qiitadonで話した連載機能のページングの案なんですがいかがでしょう?ここでは一旦リンクのMarkdownを書きますが。 2

  3. ファイルのクロールあたりで空白含むパスが拾えなかった記憶があるんですよねえ。単に文字列の判定の話だったかもしれないです 2

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?