2017-07-19 45 views
2

我卡住了。 我有文件的文件夾名稱與:將配對文件的名稱更改爲隨機名

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

這是兩個照片一個人的,所以對_side1.jpg和_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重命名文件(os.rename(元素,NEW_NAME))。我應該如何處理我的配對文件?也許我走錯了路,應該改變整個概念?

編輯:小編輯回答評論。我已經檢查瞭如何將文件名更改爲隨機文件名,但是,我不能丟失同一個人的兩張照片的軌道。我需要改變名字,因爲他們的名字提醒了研究的歷史(因此,個人1歷史上是第一個,照片分組在一起),我必須給他們沒有這種關聯的名字。

謝謝你,你真棒:)

+0

你可以發佈你想要的輸出? – Ajax1234

+0

關於你的最後一段,當我們不知道你想通過重命名文件實現什麼時,很難判斷你是否在正確的軌道上。 – SwiftsNamesake

回答

0

讓我們嘗試類似:

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.. 

注意,如果你只是隨機地從舊到新置換的個體數量和os.rename,你可能會在自己的文件步驟。
例如,假設您將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

如果你正在試圖找出如何匹配的文件,我會用一本字典。字典的鍵將是單個數字,並且值將是照片/文件名的列表。事情是這樣的:

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' 
相關問題