比较两个目录,然后删除不匹配的内容(Python)



你好,stackoverflow社区!救命啊,怎么实施已经伤透了脑筋。

例如,有文件夹:"D:\left"one_answers"C:\right"。

它们包含以下内容:文件、带文件的目录、子目录、带文件子目录。大部分内容是相同的,但"C:\right"中可能存在"额外"内容(与"D:\left"的内容不匹配(。

我如何比较"С:\right"中的内容,"D:\left"中没有的内容,然后("С:\ right"中多余的内容(将其删除,以便文件夹"D:\right"one_answers"C:\right"变得相同(在我们的情况下,我们不看大小、时间等-纯粹根据其内容的名称(。

试着这样去除多余的:

difs = list(set(os.listdir('C:right')) - set(os.listdir('D:left')))

但这还不够,因为它不会将效果传播到子目录。

也像这样:

from dirsync import sync
sync('D:left', 'C:right', 'diff')

但是,我只对输出的一小部分感兴趣,我根本不清楚如何将这个输出删除

删除从"C:\right"到从0到"D:\left"再到"C:\right"的所有内容都不是解决方案。

我很确定解决方案是专注于:

os.walk

但我就是排不好队:(

非常感谢你的帮助,我为你的愚蠢道歉。

我附上屏幕截图以提高的清晰度

入口:入口入口2

运行程序后所需的结果:后果结果2

您可以使用Path.rglob:

from pathlib import Path
pl = Path(path/to/left)
pr = Path(path/to/right)
difference = (set(map(lambda p: p.relative_to(pr), pr.rglob('*'))) -
set(map(lambda p: p.relative_to(pl), pl.rglob('*'))))

这里有一个例子:

right
file1
file5
dir1
file2
file6
dir2
file3
file7
subdir1
file4
file8
subdir2
file9
subdir3
left
file1
dir1
file2
dir2
file3
subdir1
file4
>>> difference
{PosixPath('dir1/file6'),
PosixPath('file5'),
PosixPath('dir2/subdir3'),
PosixPath('dir2/subdir2'),
PosixPath('dir2/subdir1/file8'),
PosixPath('dir2/subdir2/file9'),
PosixPath('dir2/file7')}

现在您只需要删除difference中的所有文件和目录。

非常感谢Riccardo Bucco的回复。我做到了,现在看起来是这样的:

from pathlib import Path
import shutil
import os
pl = Path(left_way) # left_way = r'D:left' = 'D:\left' 
pr = Path(right_way) 
difference = (set(map(lambda p: p.relative_to(pr), pr.rglob('*'))) - set(
map(lambda p: p.relative_to(pl), pl.rglob('*')))) # RB genius move
if len(difference) > 0:
print('nContent to be deleted:n')
for a in difference:
a2 = Path(pr, a)
print('   ', a2)
while True:
copyornot = input('nDelete? (Y/n):n')
if copyornot == 'Y':
break
elif copyornot == 'n':
print('...')
continue
else:
print('(Y/n)')
for a in difference:
a2 = Path(pr, a)
if os.path.isfile(a2):
os.remove(a2)
if os.path.isdir(a2):
shutil.rmtree(a2)
print('nShift is over, go drink beer')

相关内容

  • 没有找到相关文章

最新更新