Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将成对文件的名称更改为随机名称_Python_Filenames - Fatal编程技术网

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

Python 将成对文件的名称更改为随机名称,python,filenames,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 rando

我卡住了。 我有一个文件夹,其中的文件名为:

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)    
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
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)    
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]
我知道我可以使用os.rename来重命名文件(os.rename(element,new_name))。我应该如何处理配对文件?也许我走错了路,应该改变整个观念

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


谢谢你,你太棒了:)

如果你想知道如何配对文件,我会用字典。字典的键是单个数字,值是照片/文件名的列表。大概是这样的:

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

请注意,如果您只随机排列单个数字,并将操作系统从旧重命名为新,您可能会选择自己的文件。

例如,假设您将id 1分配给20,将id 20分配给3,那么当您处理id 1时,您
重命名('individual_1_side1.jpg','individual_20_side1.jpg')
,因此当您要将20更改为3时,
individual_20_side1.jpg'
不再是individual 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'

你能发布你想要的输出吗?关于你的最后一段,当我们不知道你试图通过重命名文件实现什么目标时,很难判断你是否在正确的轨道上。