6

シナリオ:オブジェクトを撮影するとき、複数の角度から複数の画像を撮影します。「撮影」するオブジェクトの数を掛けると、大量の画像を生成できます。問題:カメラは、「DSCN100001」、「DSCN100002」などとして識別される画像を生成します。不可解です。

ディレクトリ指定(Windows)と「プレフィックス」を要求するスクリプトをまとめました。スクリプトはファイルの作成日時を読み取り、それに応じてファイルの名前を変更します。ファイル名の前にプレフィックスが追加されます。したがって、「DSCN100002.jpg」は「FatMonkey2011072117:51:02」になる可能性があります。時間の詳細は、年表にとって私にとって重要です。

スクリプトは次のとおりです。Pythonicであるかどうか、記述が不十分であるかどうか、そしてもちろん、よりクリーンな、より効率的な方法があるかどうかを教えてください。ありがとうございました。

   import os
   import datetime
   target = raw_input('Enter full directory path: ')
   prefix = raw_input('Enter prefix: ')
   os.chdir(target)
   allfiles = os.listdir(target)
   for filename in allfiles:
        t = os.path.getmtime(filename)
        v = datetime.datetime.fromtimestamp(t)
        x = v.strftime('%Y%m%d-%H%M%S')
        os.rename(filename, prefix + x +".jpg")
4

3 に答える 3

8

あなたがそれをしている方法はPythonicに見えます。いくつかの選択肢(必ずしも提案ではありません):

スキップしてループ内os.chdir(target)で実行できます。os.path.join(target, filename)

strftime('{0}-%Y-%m-%d-%H:%M:%S.jpg'.format(prefix))文字列の連結を回避するために行うことができます。これは私がお勧めする唯一のものです。

、、、およびtemp_dateの代わりにt、のような変数名を再利用できます。これで大丈夫です。vx

一時変数の保存をスキップして、次のようにすることができます。

for filename in os.listdir(target):
    os.rename(filename, datetime.fromtimestamp(
                         os.path.getmtime(filename)).strftime(
                          '{0}-%Y-%m-%d-%H:%M:%S.jpeg'.format(prefix)))

を使用して、再帰ディレクトリで機能するように関数を一般化できますos.walk()

ファイルのファイル拡張子を検出できるので、.jpegsだけでなく正しいでしょう。

フォームのファイルの名前を変更しただけであることを確認できますDSCN1#####.jpeg

于 2011-07-21T16:13:58.447 に答える
3

あなたのコードは素晴らしくてシンプルです。私が提案できるいくつかの可能な改善:

  1. TABによる自動補完のため、ディレクトリ名にはコマンドライン引数の方が適しています
  2. EXIFは、写真作成の日付と時刻のより正確なソースです。画像エディタで写真を変更するmodify timeと、EXIF情報は保持されたまま変更されます。Python用のEXIFライブラリについての説明は次のとおりです。Python用のExif操作ライブラリ
于 2011-07-21T16:18:34.350 に答える
2

私の唯一の考えは、コンピュータに仕事を任せるなら、もっと多くの仕事をコンピュータに任せてくださいということです。私の想定では、1 つのオブジェクトを数回撃ってから、別のオブジェクトに移動するか、別のオブジェクトを所定の位置に移動します。その場合は、タイムスタンプがどれだけ近いかによって写真をグループ化することを検討できます (おそらく、2 分を超える差分は新しいオブジェクトと見なされます)。次に、これらの疑似クラスターに基づいて、オブジェクトごとに写真に名前を付けることができます。

あなたが探しているものではないかもしれませんが、提案に追加したいと思いました。

于 2011-07-21T16:42:32.813 に答える