2017-12-11 17 views
0

タイムラインを作成したい1000個の写真のフォルダがあります。写真は60秒ごとに撮影され、10分間隔のタイムラプスを作りたいと思います。だから私はすべての2番目から9番目の写真を削除し、それをループする必要があります。たとえば、フォルダに1000個の写真がある場合、スクリプトに写真1、10、20、30などを保存したいと思います。このスクリプトの最後に、フォルダには100枚の写真しか含めるべきではありません。2番目から9番目のファイルを削除し、タイムアウトのためにループします。Python

次のコードは、私が欲しいとまったく行っていないすべての「10番目」の写真を、削除します。それは、すべての第二-9日の写真を削除するよう

import os 
dir_to_clean = '/Users/myname/Desktop/TBD' 
l = os.listdir(dir_to_clean) 

for n in l[::10]: 
    os.unlink(dir_to_clean + '/' + n) 

は、どのように私はこのコードを変更しますか?フォルダに偶数個のファイルがない場合(たとえば、1005個のファイルがある場合など)は、実行する必要があります。

答えて

1

まず最初に、ソートを行うために基礎となるOSの索引付けに頼るべきではありません。イメージリストを自分でソートする必要があります(うまくいけば、その名前は辞書順です)。以下のような画像のリストについては

import os 

dir_to_clean = '/Users/myname/Desktop/TBD' 
images = sorted(os.listdir(dir_to_clean)) 

for i, image in enumerate(images): 
    if i % 10 != 0: 
     os.remove(os.path.join(dir_to_clean, image)) 

一度ソート第二に、ちょうどあなたのリストを列挙し、すべての10番目の項目を削除しない、例えば["image000.jpg", "image001.jpg", "image002.jpg", "image003.jpg", ... "image035.jpg"]これはimage000.jpg以外のすべての画像を削除します、image010.jpgimage020.jpgimage030.jpg

+0

私はimage000としてファイルを保存する必要があります - image010.jpgなど? このコードでは、10で割った値が0でないファイルを探しますか?したがって、私は数字でファイルに名前を付けるべきですか?それとも、単に画像の順番を数えるだけなので、10番目のファイルは削除されません。 – D500

+0

@ D500 - ファイルの名前を変更する必要はありません。それらは辞書編集の順序でソートされ、10分の1を除くすべてのファイルは名前に関係なく削除されます。あなたは 'os.listdir()'呼び出しの中で 'sorted()'を取り除いて、名前に関係なくOSの索引順にソートすることができますが、これは必ずしも作成順序を保証するものではないと警告しました。 – zwer

+0

Hrm ..コードでの奇妙な振る舞い。私はそれを実行し、それは正常に2-9番目の写真を削除したが、私にエラーを与え、残りの画像が壊れています。このエラーを修正するにはどうすればよいですか? os.remove(os.path.join(dir_to_clean、画像)) FileNotFoundErrorにおけるファイル "TimeLapseScript.py"、行8:[エラー番号2]このようなファイルまたはディレクトリ:「/ボリューム/ Seagate35TB /微速度撮影/Photos/Reduce/G0036768.JPG ' – D500

0

あなたはので、私はこのような何かのために行くだろう10分の範囲内のすべての最初と最後維持したい:

import os 
dir_to_clean = '/Users/myname/Desktop/TBD' 
images = sorted(os.listdir(dir_to_clean)) 

for i, x in enumerate(images): 
    #print i, i % 10 
    if i % 10 == 0 or i % 10 == 9: 
     print("Keeping : " + str(x)) 
    else: 
     print("Deleting: " + str(x)) 
     os.remove(os.path.join(dir_to_clean, image)) 
関連する問題