复制文件并使用python基于CSV重命名它们

时间:2018-08-09 20:04:57

标签: python copy rename

我大约需要复制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] + '!'

2 个答案:

答案 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解决此问题。

这是我要设置的方式。

假设您拥有csvold_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