你好,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')