您将获得以下格式的数组:
file_name_and_desti_subdir
= [['1020','A']
['1020','A']
['1106','A']
['1003','B']
['1003','B']
['1004','C']
['1005','C']]
使用此数组,您需要从给定目录复制到给定目标目录。“1013”指定没有扩展名的文件名,“A”指定目标的子目录。
因此,在代码运行完成后,文件结构应如下所示:
Destination
A
1020.jpg
1020(1).jpg
1106.jpg
B
1003.jpg
1003(1).jpg
C
1004.jpg
1005.jpg
为此,您需要从源文件中选择正确的项目并将其复制到目标文件中的所需位置。
这里是我累了。(或者至少是它的简化版本)
from shutil import copy
from os import wlak, path
def copyFile(source, desti, file_name_and_desti_subdir)
for item in file_name_and_desti_subdir:
for root, subdir, files in walk(source): #using os.walk to find correct item in source
for file in files:
item_source_path = path.join(root, file) #constructing source path of item
if file.split('.')[0] == item[0]: #choice structure
if item[1] == 'A':
copy(item_source_path, desti + "\\A")
elif item[1] == 'B':
copy(item_source_path, desti + "\\B")
elif item[1] == 'C':
copy(item_source_path, desti + "\\C")
但是,此代码将产生以下文件结构:
Destination
A
1020.jpg
1106.jpg
B
1003.jpg
C
1004.jpg
1005.jpg
请注意,已复制两次的项目不包括在内,因为它们已被覆盖。我的问题是如何防止这种形式的发生。
对于任何感兴趣的人,我最终在评论中使用了 VPfB 提供的示例。他提供的例子不是他自己的。它是用 python 2 编写的,因此必须进行一些更改。它还将文件的版本附加到扩展名,这会引起一些麻烦。(原始示例)这是我调整后的版本。
from os import path
from shutil import copy
def VersionFile(source, destination):
if path.isfile(destination):
name, extension = path.splitext(destination)
for i in range(1000):
new_file = f'{name} ({i}){extension}'
if not path.isfile(new_file):
copy(source, new_file)
break
为此,我还需要查找数组中的任何重复项,然后计算每个出现的次数。我将重复项保存在一个数组中,然后保存它们在另一个并行数组中出现的次数。
然后在核心循环中,我将 ifs 和 elifs 更改为如下:
if item[1] == 'A':
copy(item_source_path, desti + "\\A")
if item in duplicates:
for i in range(duplicates_count[duplicates.index(item)])
VersionFile(item_source_path, desti + "\\A\\" + file)
break
(增加了休息时间以减少运行时间)
然后在第一个 for 循环之后,我只是添加了一个检查以确保该项目的所有后续出现都被忽略。从现在开始,我还需要按索引引用项目。(重复项总是紧挨着出现。)。
for i in range(len(file_name_and_desti_subdir):
item = file_name_and_desti_subdir[i]
if package == file_name_and_desti_subdir[i - 1]:
pass
else:
...(main loop)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句