重複ファイルの検索

picasaで写真から顔を検出する機能があっておもしろいなあと見ていたら、同じ画像ファイルがやたらとたくさんあるのが気になった。もう最近はハードディスクの空き容量がなくなるということがすっかりなくなったが、やっぱり同じファイルがたくさんあるのは気持ち悪いので、重複する画像ファイルを探してリストアップしようと思った。しばらく前にperlでそれを作ってあったので動かしてみたがなかなか終わらない。おかしいなと調べてみるとある場所をずっと繰り返して検索している。以前はちゃんと動いたはずなのに・・・最近perlは使っていず忘れていたのと、pythonの勉強を兼ねてpythonで作ろうとしてみた。しかし、数時間かけたがうまくいかない。

あきらめて、とりあえず画像ファイルをすべてリストアップしてテキストに書き出し、それをexcelで開いてファイル名で並べ替えて重複をチェックしてみた。しかし、ファイル名だけではちぇっくにならない。「1.jpg」という名前でも全然違うファイルがある。perlで作ったときは、ファイルサイズも調べて、サイズと名前が一致するものを重複候補とした。そこまですれば、後は目視でチェックしてもそれほど手間ではなかった。が、pythonで同じ事をやろうとしたがうまくできなかった。くやしいな・・・・




こんなものを作ってみた。

class MyFile:
def __init__(self,name1,size1,path1):
self.name = name1
self.size = size1
self.path = path1
def getName(self):
return self.name
def getSize(self):
return self.size
def getPath(self):
return self.path
file1 = MyFile("taro",110,"c:\\file\\")
file2 = MyFile("jiro",120,"c:\\file\\")
file3 = MyFile("saburo",130,"c:\\file\\")
print file1.getName()
print file2.getPath()
print file2.getSize()


実行してみた。

C:\>python ob.py
taro
c:\file\
120


"MyFile"というクラスを作ってみた。「クラス」というのは、プロトタイプのようなものだ。「概念」と言えばいいだろうか。クラスそのものは実体ではない。

file1 = MyFile("taro",110,"c:\\file\\")


とやって、初めて file1 という「実体」が存在する。これを「インスタンス」と呼ぶ。このクラスを使って、PCに存在するファイルの名前、サイズ、パスを記録するにはどうすればいいか。このクラスを配列にすることができるか?もしくはインスタンス名を変数にすることができるか?・・・・わからない。

考え方を変える。配列に「ファイルサイズ(スペース)ファイル名」、「パス」という順番に記録していく。そしてその配列を全部読んで、別のリストに「ファイルサイズ(スペース)ファイル名」が存在しなければ記録していく。このときすでに存在していれば、サイズとファイル名が両方同じファイルだということになる。

import os
list1=[]
filelist=[]
duplicate_count =0
file_count=0
rootdir = "/"
for (root, dirs, files) in os.walk(rootdir):
for f in files:
name, ext = os.path.splitext(f)
if ext == (".jpg" or ".png" or ".bmp"):
try:
fsize=os.path.getsize(os.path.join(root, f))
except:
print "some error happened. keep on going anyway..."
str1 = str(fsize) + " " + f
list1.append(str1)
list1.append(os.path.join(root, f))
for i in range(len(list1)):
#    print list1[i]
if ((i % 2) == 0):
file_count += 1
if list1[i] in filelist:
print "already exists:  " + list1[i]
duplicate_count += 1
else:
filelist.append(list1[i])

twitterでblockしているユーザの一覧

python-twitterには block 関連が実装されていない。自分がblockしているユーザを知りたい。これくらいしかわざわざAPIを使おうと思う機会はない。直接APIを呼ぼうかと思ったがわからず、tweepyがあることを知る。

ついでに easy_install という、perlのppmみたいなものがあることを知る。pythonのインストールフォルダの下に scripts というフォルダがあり、そこにインストールされている。さっきsetup_toolsとかいうのをインストールしたときにインストールされたのかな?それとも最初からあったのかな?不明。pathに c:\python27\scripts を追加すると、コマンドプロンプトで以下のようにしてtweepyをインストールできた

easy_install tweepy
では、ブロックユーザ一覧のサンプルです。
import tweepy
consumer_key = '***'
consumer_secret = ' *** '
access_key = ' *** '
access_secret = ' *** '
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth_handler=auth)
results = api.blocks()
for result in results:
print result.screen_name

How simple!
最後を以下のようにすれば、block解除できる。
for result in results:
api.destroy_block(result.id)

perlよりいいかも。ちなみに、access_key と access_secret は、twitterのアプリケーション登録画面で取得できる。もし、第三者にAPIを利用させたい場合は、これらをユーザの了解のうえで取得することができる。「Authorize app」とかいうボタンが表示されるあの画面である。今回のように、自分のPCでちゃちゃっと使うような場合はソースの中に直接書いてしまえばよい。

python-twitter

twitter apiを使ってみる。モジュールのダウンロードとインストールが必要。ちょっと多い。

まずpython-twitter

http://code.google.com/p/python-twitter/


python-twitterを使うには以下のモジュールが必要。

http://cheeseshop.python.org/pypi/simplejson
http://code.google.com/p/httplib2/
http://github.com/simplegeo/python-oauth2


さらに、python-oauth2をインストールするには setuptoolsというモジュールが必要。

http://pypi.python.org/pypi/setuptools#files


必要なモジュールがそろったら、以下の順にインストールする。

setuptools→ simplejson, httplib2, oauth2 → python-twitter

setuptoolsはwindows用のインストーラがある。

次の3つのモジュールは皆、解凍したフォルダの中で以下のコマンドでインストールできる。

python setup.py install


python-twitterは、以下のようにbuild と installが必要。

C:\python-twitter-0.8.1>python setup.py build
C:\python-twitter-0.8.1>python setup.py install


・・・やっぱりperlのCPANみたいに楽ではない。




<サンプル>

import twitter
api = twitter.Api()
statuses = api.GetPublicTimeline()

print '<html><head><title>tl</title><meta charset="utf-8"></head>'
print "<body>"


for s in statuses:
print "<p>"
print "<b>" + s.GetUser().GetScreenName()+ "</b><br>",
s.GetText().encode("utf-8","replace") + "<br>"
print "</p>"

print "</body></html>"


python twi.py > tl.html


とやってブラウザで見てください。




tweetするやつ。

# -*- coding: utf-8 -*-
import twitter
from urllib import urlencode
from oauth2 import Client, Consumer, Token
account_name = 'your_account_name'
account_pass = 'your_password'
consumer_key = 'your_consumer_key'
consumer_secret = 'your_consumer_secret'
access_token_key = 'your_access_token_key'
access_token_secret = 'your_access_token_secret'
client = Client(Consumer(consumer_key, consumer_secret),
Token(access_token_key, access_token_secret))
client.request('http://api.twitter.com/1/statuses/update.xml',
'POST',
urlencode({'status':'GOOD MORNING'}))





python

暇なのでpythonを使ってみた。

pythonのインタープリタをインストールする。

c:\python27


というフォルダにインストールされた。

バージョンは2系列あるそうだが、日本pythonユーザ会とかいうサイトに、

どちらか迷ったら2.7にしましょうとあったのでそうする。

windowsのpathに上記のフォルダを追加する。

コマンドプロンプトで python とやるとインタプリタが起動する。

終了は ctrl+z + enter

ファイルを実行する場合は

python sample1.py


というようにする。

.py じゃないとダメかは知らない。




<サンプル1>

名前を入力すると挨拶する。

文字列の連結は + を使う。

name=raw_input('enter your name: ')
print 'hello, ' + name


<サンプル2>

ファイルの中身を表示する。

for とか if の後ろにはコロンがいる。

for line in open('readme.txt','r'):
print line


<サンプル3>

指定したキーワードを含むyoutubeの動画タイトルを表示する。

(gdata-python-clientのダウンロードとインストールが必要。すぐ終わる。)

# -*- coding: utf-8 -*-
import sys
import gdata.youtube
import gdata.youtube.service
argvs = sys.argv
argc = len(argvs)
if (argc != 2):
quit()
client = gdata.youtube.service.YouTubeService()
query = gdata.youtube.service.YouTubeVideoQuery()
query.vq = 'argvs[1]'
query.max_results = 25
query.start_index = 1
query.racy = 'exclude'
query.orderby = 'relevance'
feed = client.YouTubeQuery(query)
for entry in feed.entry:
print entry.title.text


perlの代替になるかと思っているのだが、perlほど自由奔放な感じはなく、

キッチリしている感じ。