我卡住了。 我有一个文件夹,其中包含名称为
的文件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在历史上是第一位的,而且这些照片组合在一起),我必须给他们一些没有这种关联的名字。
谢谢你,你真棒!)
答案 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'