Python 通过重命名修复csv列中具有相同图像的不同id?
作为一名新的Python程序员,我很难理解如何完成以下任务 给定csv文件中的输入数据:Python 通过重命名修复csv列中具有相同图像的不同id?,python,Python,作为一名新的Python程序员,我很难理解如何完成以下任务 给定csv文件中的输入数据: Sku图像\u名称 B001 a.jpg B002 a.jpg B001 b.jpg B002 c.jpg B003 x.jpg 其中,多个Sku可能具有相同的图像名称。当出现这种情况时,我想通过将“+Sku值连接到同一行中的图像名称,来重命名image\uu name列中的图像名称 因此,所需的输出数据为: Sku图像\u名称 B001 a_B001.jpg B002 a_B002.jpg B001 b
Sku图像\u名称
B001 a.jpg
B002 a.jpg
B001 b.jpg
B002 c.jpg
B003 x.jpg
其中,多个Sku
可能具有相同的图像名称。当出现这种情况时,我想通过将“
+Sku
值连接到同一行中的图像名称,来重命名image\uu name
列中的图像名称
因此,所需的输出数据为:
Sku图像\u名称
B001 a_B001.jpg
B002 a_B002.jpg
B001 b.jpg
B002 c.jpg
B003 x.jpg
之后,应根据image\u Name
列重命名图像文件夹中的图像
到目前为止,我只有这些:
import csv
#open and store the csv file
with open('D:\\test.csv', 'rb') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
好的,您还有很多路要走,但这应该会给您一些关于如何继续的提示(假设文件数量合理):
有很多方法可以改进此代码。这里的目的是让它更容易理解。首先理解它,然后改进它。那么你想在图像文件夹中将
a.jpg
重命名为两个不同的名称吗?是的,只有当不同的sku具有相同的imagename大小写时,我想你没有领会我的意思。一般来说,一个文件只有一个名称,因此不可能给a.jpg
两个不同的名称。@martineau我猜(希望)OP中所有sku都有名为{name}{sku}.jpg
的图像。虽然我可能错了。@Wayne:我怀疑这一点,因为在接近结尾的部分,OP希望相应地重命名图像文件夹中的文件。我想可以用不同的名称创建同一图像文件的多个副本,但这样做也没有多大意义(IMO)。我有一个图像文件,我需要创建另一个副本,并根据图像列重命名,,,,如果您能解释逻辑的话?非常感谢much@sqllover999如上所述。east to understand方法是使用需要复制的所有文件的新名称进行复制,然后删除具有原始名称的版本。显然,在每种情况下少复制一个副本并用重命名来代替它更有效,但要做到这一点有点困难。上面有足够的内容需要学习,所以请先记下来。@sqllover999您看到我在上面根据您的评论所做的更改了吗?
import csv
import os
from os.path import splitext # splits name & extension from a file
import shutil #making a duplicate copy of a file
from os import rename
#open and read csv
with open('test.csv') as csvfile:
#create list for sku,old_imagename and new imagename
itemList = []
renamedList = []
keyList = []
spamreader = csv.reader(csvfile, delimiter=",")
#processing every row at a time
for row in spamreader:
keyList.append(row[0]) #for sku
itemList.append(row[1]) #for old_imagename
renamedList.append(row[1]) #for new_imagename
#Processing only sku having same images
toBeChanged = [itemNum for itemNum, item in enumerate(itemList)
if itemList.count(item) > 1]
for itemNum in toBeChanged:
name, ext = splitext(itemList[itemNum]) # splitting image name & extension: eg a-> "a" & "jpg"
oldFileName = name + ext
print("oldFileName = " + oldFileName) # oldFileName = a.jpg
newFileName = '{}_{}{}'.format(name, keyList[itemNum], ext)
print("newFileName = " + newFileName) # newFileName = a_B001.jpg & a_B002.jpg
# check if the Image file exists,
if(os.path.isfile(oldFileName)):
shutil.copy2(oldFileName, newFileName); # creating a duplicate image file
renamedList[itemNum] = '{}_{}{}'.format(name, keyList[itemNum], ext) #a_B001.jpg
# os.remove(oldFileName)
#write the final output in new csv
with open('newCsv.csv','w') as mycsv:
csvWriter = csv.writer(mycsv,delimiter=",")
for row in zip(keyList, renamedList):
print(row[0] + '\t' + '\t' + row[1])
csvWriter.writerow([row[0],row[1]])
import csv
import os
from os.path import splitext # splits name & extension from a file
import shutil #making a duplicate copy of a file
from os import rename
#open and read csv
with open('test.csv') as csvfile:
#create list for sku,old_imagename and new imagename
itemList = []
renamedList = []
keyList = []
spamreader = csv.reader(csvfile, delimiter=",")
#processing every row at a time
for row in spamreader:
keyList.append(row[0]) #for sku
itemList.append(row[1]) #for old_imagename
renamedList.append(row[1]) #for new_imagename
#Processing only sku having same images
toBeChanged = [itemNum for itemNum, item in enumerate(itemList)
if itemList.count(item) > 1]
for itemNum in toBeChanged:
name, ext = splitext(itemList[itemNum]) # splitting image name & extension: eg a-> "a" & "jpg"
oldFileName = name + ext
print("oldFileName = " + oldFileName) # oldFileName = a.jpg
newFileName = '{}_{}{}'.format(name, keyList[itemNum], ext)
print("newFileName = " + newFileName) # newFileName = a_B001.jpg & a_B002.jpg
# check if the Image file exists,
if(os.path.isfile(oldFileName)):
shutil.copy2(oldFileName, newFileName); # creating a duplicate image file
renamedList[itemNum] = '{}_{}{}'.format(name, keyList[itemNum], ext) #a_B001.jpg
# os.remove(oldFileName)
#write the final output in new csv
with open('newCsv.csv','w') as mycsv:
csvWriter = csv.writer(mycsv,delimiter=",")
for row in zip(keyList, renamedList):
print(row[0] + '\t' + '\t' + row[1])
csvWriter.writerow([row[0],row[1]])