比较两个目录,然后删除不匹配项 (Python)
Comparing two directories and then removing mismatches (Python)
Whosebug 社区,您好!求救,怎么实现已经脑残了。
例如,有文件夹:'D:\left'和'C:\right'。
它们包含的内容:文件、带文件的目录、子目录、带文件的子目录。大部分内容相同,但'C:\right'中可能有'extra'个内容(与'D:\left'中的内容不匹配)
我如何比较'С:\right'中的内容(内容),'D:\left'中不存在的内容,然后('С:\right'中的额外内容)将其删除,以便文件夹 'D:\left' 和 '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
但我就是不能把它排好:(
非常感谢您的帮助,对于我的愚蠢行为,我深表歉意。
为了清楚起见,我附上了屏幕截图
入口:
Entrance
Entrance2
运行 程序后的预期结果:
Result
Result2
您可以使用 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')
Whosebug 社区,您好!求救,怎么实现已经脑残了。
例如,有文件夹:'D:\left'和'C:\right'。
它们包含的内容:文件、带文件的目录、子目录、带文件的子目录。大部分内容相同,但'C:\right'中可能有'extra'个内容(与'D:\left'中的内容不匹配)
我如何比较'С:\right'中的内容(内容),'D:\left'中不存在的内容,然后('С:\right'中的额外内容)将其删除,以便文件夹 'D:\left' 和 '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
但我就是不能把它排好:(
非常感谢您的帮助,对于我的愚蠢行为,我深表歉意。
为了清楚起见,我附上了屏幕截图
入口: Entrance Entrance2
运行 程序后的预期结果: Result Result2
您可以使用 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')