将配对文件的名称更改为随机名称
Changing the names of paired files to random names
我卡住了。
我有一个文件夹,其中的文件名称为:
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(element, new_name))。我应该如何处理我的配对文件?也许我走错了路,应该改变整个概念?
编辑:小编辑以回答评论。我已经检查了如何将文件名更改为随机文件名,但是,我不能忘记同一个人的两张照片。我需要更改名称,因为他们现在的名字让人想起研究的历史(所以个人 1 在历史上是第一个,照片组合在一起)我必须给他们起没有那种关联的名字。
谢谢你,你太棒了:)
如果您想了解如何配对文件,我会使用字典。字典的键是单个数字,值是 photos/filenames 的列表。像这样:
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]
让我们试试这样的东西:
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.
的重命名文件
您可以使用 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
要随机更改分配给每个人的号码:
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'
我卡住了。 我有一个文件夹,其中的文件名称为:
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(element, new_name))。我应该如何处理我的配对文件?也许我走错了路,应该改变整个概念?
编辑:小编辑以回答评论。我已经检查了如何将文件名更改为随机文件名,但是,我不能忘记同一个人的两张照片。我需要更改名称,因为他们现在的名字让人想起研究的历史(所以个人 1 在历史上是第一个,照片组合在一起)我必须给他们起没有那种关联的名字。
谢谢你,你太棒了:)
如果您想了解如何配对文件,我会使用字典。字典的键是单个数字,值是 photos/filenames 的列表。像这样:
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]
让我们试试这样的东西:
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.
您可以使用 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
要随机更改分配给每个人的号码:
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'