将配对文件的名称更改为随机名称

时间:2017-07-19 13:19:17

标签: python filenames

我卡住了。 我有一个文件夹,其中包含名称为

的文件
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]

我想在这里我应该通过他们的个人编号以某种方式配对这些文件,但我不知道如何开始这样做。 我认为新名称应如下所示:

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

我知道我可以使用os.rename重命名文件(os.rename(element,new_name))。我该如何处理配对文件?也许我走错了路,应该改变整个概念?

编辑:小编辑以回答评论。我已经检查了如何将文件名更改为随机文件名,但是,我不能丢失同一个人的两张照片的轨迹。我需要更改名称,因为他们现在的名字提醒了研究的历史(所以个人1在历史上是第一位的,而且这些照片组合在一起),我必须给他们一些没有这种关联的名字。

谢谢你,你真棒!)

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您想弄清楚如何配对文件,我会使用字典。字典的键是单个数字,值是照片/文件名的列表。像这样:

ArrayList<String> listednames = new ArrayList<>();

while (true) {
    String entry = JOptionPane.showInputDialog("name:");
    if (entry == null) {
        break;
    }
    entry = entry.trim();
        String firstLetter = entry.substring(0,1).toUpperCase();
        String end = entry.substring(1).toLowerCase();
        String whole = firstLetter + end;

    if (entry.equalsIgnoreCase("stop")) {
        break;
    }
    if (entry.isEmpty()) {
        continue;
    }
    if (listednames.contains(entry)) { // .equalsIgnoreCase wont work with lists
        continue;
    }

    listednames.add(entry);
    Collections.sort(listednames);
    String namen = listednames.toString();
    namen = namen.substring(1, namen.length()-1);
    System.out.println(namen);

}

答案 2 :(得分: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。

答案 3 :(得分: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'