我正在使用python中的脚本来复制和重命名基于csv的一堆图像。
名为&#34的图像文件夹;原件"就像:
Alpha_1.jpg
Beta_2.jpg
和csv。包含:
Alfa_1.jpg 4474094_1
Beta_2.jpg 4474094_2
Beta_2.jpg 4474094_3
因此,结果应留在名为" newnames"的新文件夹中。同样的图像如:
4474094_1.jpg
4474094_2.jpg
4474094_3.jpg
4474094_2.jpg和4474094_3.jpg与Beta_2.jpg相同的图片
我有以下代码无法使用,请提出任何建议,我将不胜感激!
import os
import csv
import sys
import shutil
def copy_rename():
os.chdir(r"C:\Transformer-SSBI\Original")
saved_path = os.getcwd()
file_list = os.listdir(saved_path)
src_dir= r"C:\Transformer-SSBI\Originals"
dst_dir= r"C:\Transformer-SSBI\Newnames"
IDs = {}
with open (r'transformer.csv','rb') as csvfile:
Reader = csv.reader(csvfile, delimiter = ';')
for row in Reader:
IDs[row[0]] = row[1]+'.jpg'
for row in IDs:
for file_name in file_list:
if file_name in row:
oldname = shutil.copy(file_name,dst_dir)
newname = IDs[file_name]
os.rename(oldname, newname)
copy_rename()
答案 0 :(得分:0)
由于您将映射存储在地图中,并且Beta_2.jpg
被重命名为两个文件,因此地图中只能有一个键,因此它只会重命名为4474094_3.jpg
,而不是{{ 1}},你可以避免构建map,只需在迭代csv文件时重命名:
4474094_2.jpg
答案 1 :(得分:0)
这就像@Samuelliyi的回答,除了它避免任何竞争条件,并使用os.path.join
(略微)更多跨平台。
import os
import csv
import sys
import errno
import shutil
def copy_rename(src_dir, dst_dir, csv_path=None):
if csv_path is None:
csv_path = os.path.join(dst_dir, 'transformer.csv')
with open (csv_path, mode='rb') as csvfile:
Reader = csv.reader(csvfile, delimiter = ',')
for row in Reader:
oldname = row[0]
newname = row[1] + os.path.splitext(oldname)[1]
oldpath = os.path.join(src_dir, oldname)
newpath = os.path.join(dst_dir, newname)
try:
# the rename is implicit in the copy operation
shutil.copy(oldpath, newpath)
except OSError as e:
# only raise exception if it is something other than the file
# not existing
if e.errno != errno.ENOENT:
raise
src_dir= r"C:\Transformer-SSBI\Originals"
dst_dir= r"C:\Transformer-SSBI\Newnames"
copy_rename(src_dir, dst_dir)
此外,该功能现在更加通用,可以在具有相同结构的任何两个目录上使用(不要硬编码您可以作为参数传递的内容)。