唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Evernoteに複数のファイルを自動アップロード

最近Evernoteを使い始めたんですが,既存のフォルダ分けされた大量のファイルをアップロードするときに困って色々と試行錯誤してみました.

方法1: ウィンドウにファイルをドラッグアンドドロップ

複数のファイルが一つのノートになる.
ファイルの順番が崩れてしまうときがある.

方法2: Evernoteのショートカットにドラッグアンドドロップ

ファイル毎に別のノートになる.タグを付けるのが面倒.
多すぎる数のファイルをドラッグアンドドロップするとうまくいかない.
私の環境だと30前後が限界.

方法3: ENScript.exeを使う

Windows版EvernoteにはコマンドラインインターフェイスのENScript.exeが付属しているのでこれを利用してみました.この方法ではノートのタイトルやタグなどを指定することが可能です.
具体的な利用方法は以下のような感じです.

echo ノートの内容 | "C:\Program Files\Evernote\Evernote\ENScript.exe" createNote /i タイトル /t タグ /a 添付ファイル

なぜか今日現在「/a」で添付ファイルを登録しようとすると同期に失敗して「Unsynced Notes」に追加されてしまいます.
同様の問題で悩んでいる方→Evernote User Forum
上の方法の代わりに「/s」でファイルを指定することで,単一のファイルならば登録できるようです.

"C:\Program Files\Evernote\Evernote\ENScript.exe" createNote /i タイトル /t タグ /s 登録したいファイル
Pythonで自動化

Pythonでスクリプトを書いて自動化.
フォルダ名をタグとしてフォルダ内のファイルの登録を行います.ノート名はファイル名.
再帰的にフォルダを見ていきます.「写真」フォルダからスタートしたとき「写真/風景」フォルダにあるファイルには,「写真」「風景」という二つのタグを付けます.
以下ソースコード.同期もしたい場合はsyncDatabase()のコメントアウトを外してください.Python2.7以降で実行可能.引数としてディレクトリ名を与えてください.
バグなどがあったらコメントしていただけると嬉しいです.
ファイル名の扱いに文字コードのバグがあったので修正.(2011-02-17)

# -*- encoding: utf-8 -*-
import os
import argparse
import subprocess

def registerFile(file = "", tags = set()):
	temp = u'"C:\Program Files\Evernote\Evernote\ENScript.exe" CreateNote'
	temp += u' /s "{0}"'.format(file)
	if len(tags) >= 1:
		temp += u" /t " + " /t ".join(map(lambda x: '"' + x +  '"', tags))
	return subprocess.call(temp.encode("cp932"), shell=True)
#u"〜", u"〜"に文字化けの可能性

def syncDatabase():
	os.system('"C:\Program Files\Evernote\Evernote\ENScript.exe" syncDatabase')

def main():
#CheckArguments
	parser = argparse.ArgumentParser(description=u"Upload multiple files to Evernote.")
	parser.add_argument(u"dirname", help=u"Directory name")
	args = parser.parse_args()
	dirname = unicode(args.dirname, "cp932")
	if(not os.path.isdir(args.dirname)):
		raise ValueError(u"{0} is not a directory.".format(dirname))

	upper = (os.path.split(os.path.abspath(dirname))[0])
	count = 0
	error = []
	for root, dir, files in os.walk(dirname):
#Get Tags
		tags = set()
		path = os.path.abspath(root)
		while(path != upper):
			head, tail = os.path.split(path)
			tags.add(tail)
			path = head
#Register each file
		for file in files:
			file = os.path.join(root, file)
			print u"Processing: {0}".format(file)
			result = registerFile(tags = tags, file = file)
			count += result
			if(result != 0):
				error.append(file)
	print "{0} error(s) occurred.".format(count)
	for e in error:
		print u"Error: {0}".format(e)
#	syncDatabase()
if __name__ == '__main__':
	main()
	raw_input()

方法4: APIを使う.

申請すれば利用可能なようです.今回は触っていません.
Webアプリなどの場合にはこの方法に限られます.