背景:
我的目标是在两个不同的文件夹(没有子文件夹)中找到双重文件。为此,我使用以下Python脚本:
###Check ob alle Archive noch vorhanden oder ob Daten bei Check gelöscht wurden
def listfiles(path):
files = []
for dirName, subdirList, fileList in os.walk(path):
dir = dirName.replace(path, '')
for fname in fileList:
if fname.endswith("_GIS.7z"):
files.append(os.path.join(dir, fname))
return files
x = listfiles(root)
y = listfiles(backupfolderGIS)
#q = [filename for filename in x if filename not in y]
files_only_in_x = set(x) - set(y)
files_only_in_y = set(y) - set(x)
files_only_in_either = set(x) ^ set(y)
files_in_both = set(x) & set(y)
all_files = set(x) | set(y)
print "Alle Datein:"
print all_files
print " "
print "Nur im Zwischenspeicher:"
print files_only_in_x
print " "
print "Nur im Backupordner:"
print files_only_in_y
print " "
print "Nur einem von beiden Ordnern:"
print files_only_in_either
print " "
print "In beiden Ordnern:"
print files_in_both
print " "相关的输出变量/列表是files_in_both (文件夹);它显示了双重属性;如果我使用print,它看起来像set(['NameoftheProject_GIS.7z', 'NameofanotherProject_GIS.7z'])。
问题:
如何使用此输出/信息(目录中的一式两份文件)删除/移动它们?例如,在这里,文件夹NameoftheProject_GIS.7z和NameofanotherProject_GIS.7z中的文件backupfolderGIS / list files_in_both。
发布于 2016-06-10 10:12:41
os.walk递归地检查从您传递的根dir开始的所有文件夹和子文件夹,您希望检查两个不同的文件夹(没有子文件夹),所以只需使用glob搜索每个文件夹,如果要移动,可以使用shutil.move。
from glob import iglob
from os import path
from shutil import move
pt1, pt2 = "/path_1", "path_2"
dupe = set(map(path.basename, iglob("/path_1./*_GIS.7z"))).intersection(map(path.basename, iglob("/path_2./*_GIS.7z")))
for fle in dupe:
# move(src, dest)
move(path.join(pt1, fle), "wherever")或删除使用os.remove
for fle in dupe:
os.remove(path.join(pt1, fle))如果要从pt2中移动/删除文件,请将该文件传递给path.join而不是pt1。
您也可以将str.endwith与os.listdir结合使用。
dupe = set(fname for fname in os.listdir(pt1) if fname.endswith("_GIS.7z")).intersection(fname for fname in os.listdir(pt2) if fname.endswith("_GIS.7z"))为了避免重复,您可以将其放入一个函数中:
from shutil import move
from os import path, listdir
def listfiles(path, end):
return set(fname for fname in listdir(path) if fname.endswith(end))
for fle in listfiles(pt1,"_GIS.7z").intersection(listfiles(pt2, "_GIS.7z")):
move(path.join(t1, fle), "wherever")现在,如果您确实希望检查所有文件夹中具有相同basename的文件,因此需要对dupe名称进行检查,则需要保存完整路径的记录,可以使用违约通过basename对所有公共文件进行分组。
from os import path, walk
from collections import defaultdict
def listfiles(pth, end):
files = defaultdict(list)
for dirName, subdirList, fileList in walk(pth):
for fname in fileList:
if fname.endswith(end):
files[fname].append(path.join(dirName, fname))
return files您将得到一个数据库,其中键是basename,值是文件列表,每个文件都有完整的路径,任何具有多个vaulue的列表都意味着至少有两个同名的文件,但是您应该记住,相同的basename并不意味着文件实际上是相同的。
https://stackoverflow.com/questions/37745523
复制相似问题