2017-07-19 14 views
2

私は立ち往生しました。 _side1.jpgと_side2.jpgに終了する同じ番号を持つファイルがペアになっているので、これらは、一人の個人の写真2枚があるペアファイルの名前をランダムな名前に変更する

individual_1_side1.jpg 
individual_1_side2.jpg 
individual_98_side1.jpg 
individual_98_side2.jpg 

: 私は名前のファイルとフォルダを持っています。しかし、私は数字を他のものに変更する必要があります。ランダムに個人に割り当てられます。私はPythonで唯一の最も簡単な事を知っている...私はこのような何か試してみました:

import os 
import glob 
import random 

list_of_filenames = [] 
for element in list_of_filenames: 
    parts_of_filename = element.split("_") 
    unspecific_name = parts_of_filename[0] 
    individual_number = parts_of_filename[1] 
    type_of_photo = parts_of_filename[2] 

を私はこれが彼らのindividual_numberで何とかファイルをペアリングする必要があり、ここだと思うが、私もそれをやって起動する方法がわかりません。 私は、新しい名前は次のようになります考えた:

new_name = str(unspecific_name) + random.sample(xrange(120),1) + str(type_of_photo)  

そして私は、私は、ファイル(os.rename(要素、NEW_NAMEを))の名前を変更するos.renameを使用することができることを知っています。どのようにペアファイルを扱うべきですか?たぶん私は間違った道を歩いており、全体のコンセプトを変えるべきでしょうか?

編集:コメントに答えるための小さな編集。ファイル名をランダムなファイル名に変更する方法を確認しましたが、同じ個人の2枚の写真のトラックを失うことはできません。私は現在の名前が研究の歴史を思い起こさせるので(個人1は歴史的に最初であり、写真は一緒にグループ分けされた)、名前を変更する必要があります。

は、あなたが素晴らしいです、ありがとう:)

+0

あなたが所望の出力を投稿できますか? – Ajax1234

+0

最後の段落については、ファイルの名前を変更して達成しようとしていることがわからないときに正しいトラックにいるかどうかを判断するのは難しいです。 – SwiftsNamesake

答えて

0

は、のようなものを試してみましょう。
例えば、id 1を20と20〜3とし、id 1を処理するときにrename('individual_1_side1.jpg', 'individual_20_side1.jpg')を20〜3に変更すると、'individual_20_side1.jpg'は個別20でなく、 1.

0

ファイルをペアリングする方法を把握しようとしている場合は、私は辞書を使用します。辞書のキーは個々の数字で、値は写真/ファイル名のリストになります。このような何か:あなただけランダムに古いものから個々の数字とos.renameを並べ替える場合は、あなたがあなた自身のファイルを踏む可能性があることを

import os, random 
individuals = set() # keep only unique individuals 
for filename in os.listdir('/path/to/folder'): 
    individuals.add(int(filename.split('_')[1])) # get the integer "individual number" 

individuals = list(individuals) # cast to list type 
random.shuffle(individuals) # random shuffle 
# move the files 
for i, id in enumerate(individuals): 
    for side in [1,2]: 
     orig_name = 'individual_{}_side{}.jpg'.format(id, side) 
     new_name = 'randid_{}_side{}.jpg'.format(i, side) 
     os.system('cp {} {}'.format(orign_name, new_name)) # might need to add full paths here.. 

注:

list_of_filenames = [] 
pairs = {} 
for element in list_of_filenames: 
    parts_of_filename = element.split("_") 
    unspecific_name = parts_of_filename[0] 
    individual_number = parts_of_filename[1] 
    type_of_photo = parts_of_filename[2] 
    if dict[individual_number]: 
     dict[individual_number].append(element) 
    else: 
     dict[individual_number] = [element] 
1

itertools.groupbyを使用できます。

import os 

from itertools import groupby 

filenames = [filename for filename in os.listdir("path/2/dir")] 

for _, group in groupby(filenames, key=lambda item: item[:-5]): 

    for filename in group: 

     # genreate random numbner 

     # rename old name to new name 
0

ランダムに各個人に割り当てられた番号を変更するには:

import random 
l = ["individual_1_side1.jpg","individual_1_side2.jpg", "individual_98_side1.jpg", "individual_98_side2.jpg"] 

numbers = [int(i.split("_")[1]) for i in l] 

new_numbers = {} 

for i in set(numbers): 
    new_val = None 
    while True: 
     new_val = random.randint(1, 100) 
     if new_val != i and new_val not in new_numbers.values(): 

      break 
    new_numbers[i] = new_val 

new_files = [i.split("_")[0]+"_"+str(new_numbers[int(i.split("_")[1])])+"_"+i.split("_")[-1] for i in l] 

print(new_files) 

出力:

['individual_23_side1.jpg', 'individual_23_side2.jpg', 'individual_42_side1.jpg', 'individual_42_side2.jpg' 
関連する問題