-2

名前を変更していくつかのファイルをコピーしたい

最初の要素の場所:src/はディレクトリ、357は ID、1329844313はタイムスタンプ、.jpgはファイル拡張子です。

今、私は次のようにリストを持ちたい: (宛先ディレクトリ) + (SALT) + '_' + (ID) + (拡張子) 私のソルトは: '423l4kj2342' 私の期待される結果は:

    dest/423l4kj2342_357.jpg

私の名前変更機能は期待どおりです。

src/picture-357-1329844313.jpg  dest/423l4kj2342_357.jpg
src/picture-57-1329844816.png   dest/423l4kj2342_57.png
src/picture-358-1329844317.jpg  dest/423l4kj2342_358.jpg
src/picture-57-1329844814.jpg   dest/423l4kj2342_57.jpg
src/picture-358-1329844313.jpg  dest/423l4kj2342_358.jpg
src/picture-358-1329844325.jpg  dest/423l4kj2342_358.jpg

ただし、同じ ID を持つファイルは上書きされます。同じIDが存在する最新のファイルだけが欲しい。

今私の質問は、どうすれば次の結果を得ることができますか? 最新のタイムスタンプのみを含む同じ ID ファイルをコピーしますか?

src/picture-357-1329844313.jpg  dest/423l4kj2342_357.jpg
src/picture-57-1329844816.png   dest/423l4kj2342_57.png
src/picture-358-1329844325.jpg  dest/423l4kj2342_358.jpg
4

1 に答える 1

0

ファイル リストを ID とタイムスタンプで辞書的に降順で並べ替え、各 ID について最初の ID のみを処理します。

次のようなもの:

def cmp_file(a, b):
  id_a, timestamp_a = re.findall(r'\d+', a)
  id_b, timestamp_b = re.findall(r'\d+', b)
  return 2*cmp(id_a, id_b) + cmp(timestamp_a, timestamp_b)

filelist.sort(cmp=cmp_file, reverse=True)

last_id = None
for file in filelist:
  id, timestamp = re.findall(r'\d+',file)
  if not last_id == id:
    process_file(file)
    last_id = id

または、タイムスタンプとファイル名のタプルのリストの ID インデックス dict にファイル名を入れます。次に、dict エントリごとに、タイムスタンプが最大のものを見つけて、そのファイルを処理します。

index = dict()
for file in filelist:
  id, timestamp = re.findall(r'\d+',file)
  if not id in index:
    index[id] = list()
  index[id].append((timestamp, file))
for id, files in index.iteritems():
  process_file(files.max(key=lambda a: a[0])[1])
于 2012-09-13T07:16:56.367 に答える