基于csv复制和重命名图像管理副本python
我正在用python编写一个脚本,根据csv复制和重命名一组图像 名为“originals”的图像文件夹如下所示: Alpha_1.jpg Beta_2.jpg 还有csv。包含: Alfa_1.jpg 4474094_1 Beta_2.jpg 4474094_2 Beta_2.jpg 4474094_3 因此,结果应保留在名为“newnames”的新文件夹中的sames图像,如: 4474094_1.jpg 4474094_2.jpg 4474094_3.jpg 其中4474094_2.jpg和4474094_3.jpg与Beta_2.jpg的图片相同 我有以下代码,这是不工作,请任何意见,我将非常感谢基于csv复制和重命名图像管理副本python,python,image,csv,copy,rename,Python,Image,Csv,Copy,Rename,我正在用python编写一个脚本,根据csv复制和重命名一组图像 名为“originals”的图像文件夹如下所示: Alpha_1.jpg Beta_2.jpg 还有csv。包含: Alfa_1.jpg 4474094_1 Beta_2.jpg 4474094_2 Beta_2.jpg 4474094_3 因此,结果应保留在名为“newnames”的新文件夹中的sames图像,如: 4474094_1.jpg 4474094_2.jpg 4474094_3.jpg 其中4474094_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()
由于将映射存储在映射中,并且将
Beta_2.jpg
重命名为两个文件,因此映射中只能有一个键,因此它将仅重命名为4474094_3.jpg
,而不是4474094_2.jpg
,您可以避免构建映射,只需在迭代csv文件时进行重命名即可:
import os
import csv
import sys
import shutil
def copy_rename():
src_dir= r"C:\Transformer-SSBI\Originals"
dst_dir= r"C:\Transformer-SSBI\Newnames"
or.chdir(dst_dir)
with open (r'transformer.csv','rb') as csvfile:
Reader = csv.reader(csvfile, delimiter = ',')
for row in Reader:
oldname=row[0]
newname=row[1]+".jpg"
if os.path.exists(src_dir+"\\"+oldname):
shutil.copy(src_dir+"\\"+oldname,dst_dir)
os.rename(oldname, newname)
copy_rename()
这与@Samuelliyi answer类似,只是它避免了任何竞争条件,并且通过使用
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)
此外,该函数现在更加通用,可以在具有相同结构的任意两个目录上使用(不要硬编码可以作为参数传入的内容)。调用
os.path.exists
会创建竞争条件。如果只是在try/except
语句中执行,则更安全。感谢您提供的有用提示,我发现了类似的问题