我大约需要复制400个文件,并需要根据csv文件重命名这些文件中的某些文件将重复多次并使用不同的名称。
我有CSV文件,在A列中具有原始名称,在B列中具有新名称。
IE 1000.jpg 1000-10x10.jpg 1000.jpg 1000-12x12.jpg
我放在一起的python脚本将复制该文件,对其重命名并移动,但仅执行一次。因此,如果我需要4个重命名的1000.jpg副本,我只会得到一份。
我对此仍然很陌生,因此非常感谢您的帮助。
import os
import csv
import shutil
# open and store the csv file
IDs = {}
with open('old-names-new-names.csv','rb') as csvfile:
timeReader = csv.reader(csvfile, delimiter = ',')
# build dictionary with associated IDs
for row in timeReader:
IDs[row[0]] = row[1]
# move files
path = '/start_location/'
tmpPath = '/save_location/'
for oldname in os.listdir(path):
# ignore files in path which aren't in the csv file
if oldname in IDs:
try:
shutil.copy(os.path.join(path, oldname), os.path.join(tmpPath, IDs[oldname]))
except:
print 'File ' + oldname + ' could not be renamed to ' + IDs[oldname] + '!'
答案 0 :(得分:0)
由于使用的字典使用唯一键,因此只能得到一份副本。因此,每次您尝试使用
保存新ID时IDs [行[0]] =行[1]
如果该字典键相同,它将覆盖前一个。例如: 1000.jpg
相反,我建议使用元组列表,然后随便添加列表
>>> with open('old-names-new-names.csv') as csvfile:
... timeReader = csv.reader(csvfile, delimiter = ',')
... for row in timeReader:
... IDs.append((row[0], row[1]))
...
>>> IDs
[('1000.jpg', '1000-10x10.jpg'), ('1000.jpg', '1000-12x12.jpg'), ('1000.jpg', '1000-15x15.jpg')]
然后,您可以遍历ID以进行重命名逻辑并在元组上使用索引:
>>> for ID in IDs:
... print('old name:' + ID[0] + ' new name:' + ID[1])
...
old name:1000.jpg new name:1000-10x10.jpg
old name:1000.jpg new name:1000-12x12.jpg
old name:1000.jpg new name:1000-15x15.jpg
答案 1 :(得分:0)
如果您不熟悉Python,建议您使用Pandas解决此问题。
这是我要设置的方式。
假设您拥有csv
和old_name
列的new_name
文件。
import pandas as pd
name_map = pd.read_csv('old-names-new-names.csv')
name_map.head()
new_name old_name
0 new_33.txt old_1.txt
1 new_18.txt old_2.txt
2 new_29.txt old_3.txt
3 new_31.txt old_4.txt
4 new_64.txt old_1.txt
在start_location
中,我们有以下文件:
import os
os.listdir('start_location')
['old_1.txt', 'old_4.txt', 'old_2.txt', 'old_3.txt']
我们的save_location
目录为空。
要复制文件,我们可以像这样在Pandas数据框上进行快速循环,使用shutil
将文件复制到名称为new_name
的新目录中。
import shutil
for i, r in name_map.iterrows():
shutil.copy('start_location/{}'.format(r.old_name), 'save_location/{}'.format(r.new_name))
当我们检查目标目录时,会看到所有内容:
os.listdir('save_location')
['new_60.txt',
'new_29.txt',
'new_31.txt',
'new_64.txt',
'new_48.txt',
'new_33.txt',
'new_96.txt',
'new_18.txt']
如果您不想使用熊猫,请考虑以下选项:
import os
import csv
import shutil
with open('old-names-new-names.csv','rt') as csvfile:
timeReader = csv.reader(csvfile, delimiter = ',')
i = 0
for row in timeReader:
if i > 0:
start_loc = row[1]
save_loc = row[0]
shutil.copy('start_location/{}'.format(start_loc), 'save_location/{}'.format(save_loc))
i+=1