批量按共同的唯一值重命名文件

时间:2016-10-27 03:22:26

标签: python rename

我有一个包含500多张图片的文件夹。以及具有这些图像的新名称的文本文件。我试图在python中创建一个重命名脚本,但我正在努力解决健壮性问题。我想通过按唯一标识符

选择新名称来重命名该文件

我写了这个......

import os
import csv


img_dir = str(raw_input("Path to Images Folder as C:/path/to/IMAGES  : "))
os.chdir(img_dir)

newNames_file = str(raw_input("csv file path and name as C:/path/to/loc_data.csv  : "))

with open(newNames_file, 'rb') as f:
    reader = csv.reader(f)
    newNames = list(reader)


newNames = [l[0] for l in newNames]

print"Current Working Directory is:  " + os.getcwd()

path = os.getcwd()
filenames = [os.path.join(img_dir,fn) for fn in next(os.walk(img_dir))[2]]

assert len(filenames) == len(newNames)

for i in range(len(newNames)):
    os.rename(str(filenames[i]), str(newNames[i]))

但结果不可靠......例如保证匹配的顺序。

如何使用唯一ID在重命名函数顶部传递正确的值?

文件名是原始的,例如IMG_3036.tif

,新值的格式为7700_50fpl_4_1_3036

其中3036是唯一ID

2 个答案:

答案 0 :(得分:2)

我写了一个脚本,我认为它会起作用。

如果需要,您可以重写get_name_uid函数以获取新文件的uid和旧文件的uid。

确保在使用时更改glob名称和new_names文件名。

import glob
import os

old_image_filenames = glob.glob('*.img')
new_names = open('new_names').read().strip().split(',')

def get_name_uid(name):
    uid = name.split('.')[0]
    uid = uid.split('_')[-1]

    return uid


def get_uid_filename_map(filenames, get_uid_func):
    uid_filename_map = {}
    for filename in filenames:
        uid_filename_map[get_uid_func(filename)] = filename

    return uid_filename_map

uid_old_filenames = get_uid_filename_map(old_image_filenames, get_name_uid)
uid_new_filenames = get_uid_filename_map(new_names, get_name_uid)

for uid in uid_old_filenames.keys():
    if uid in uid_new_filenames:
        os.rename(uid_old_filenames[uid], uid_new_filenames[uid])

我在

之前运行脚本的文件夹
$ ls 
new_names       play.py         zasdf_3036.img  zxcsdf_3037.img

运行脚本后

$ ls
7700_50fpl_4_1_3036.img 7700_50fpl_4_2_3037.img new_names               play.py

file new_names

$ cat new_names
7700_50fpl_4_1_3036.img,7700_50fpl_4_2_3037.img

答案 1 :(得分:0)

这就是我最后所做的。感谢您的帮助和意见。

def main():
    pass

if __name__ == '__main__':
    main()


import os
import glob
import csv
import numpy as np



# Establish path to images that need renamed
path_to_img = raw_input("your path to your imgs\n")
glob_name = os.path.join(path_to_img, '*.tif')
old_image_filenames = glob.glob(glob_name)


# Make list from csv of new names
path_to_namefile = raw_input('your path to name file\n')

f = open(path_to_namefile)
csv_f = csv.reader(f)
csv_names = []

for i in csv_f:
    csv_names.append(i)

new_names = []
for i in csv_names:
    new_names.append(str(i)[2:-2])

print new_names



def get_name_uid(name):
    uid = name.split('.')[0]
    uid = uid.split('_')[-1]
    return uid

def get_uid_filename_map(filenames, get_uid_func):
    uid_filename_map = {}
    for filename in filenames:
        uid_filename_map[get_uid_func(filename)] = filename
    return uid_filename_map


uid_old_filename = get_uid_filename_map(old_image_filenames, get_name_uid)
uid_new_filename = get_uid_filename_map(new_names, get_name_uid)


for uid in uid_old_filename.keys():
    if uid in uid_new_filename:
        os.rename(os.path.join(path_to_img, uid_old_filename[uid]), os.path.join(path_to_img, uid_new_filename[uid]))

我不得不通过阅读csv部分来完成工作。我不认为实际上有一个numpy模块......不确定那里的结果如何,但这很好用所以我不再改变它了。