[英]pathlib.Path with broken links
我使用pathlib.Path
模块已经有一段时间了,因为它比os.path
灵活和可读得多。 直到现在,我还没有发现Path
没有涵盖的案例。
我有一个目录,其中包含指向我无权访问的目录的链接(我不属于该组)。 例如:
> ls dir1
dir1/link1 -> /another_dir/file (No access)
根目录( p
对象)包含几个子目录,损坏的链接可以位于子树的各个级别。
我正在尝试找到这些损坏的链接并将其删除。 但是我没有找到正确的方法:
如果我使用rglob
, function 只返回有效的文件和目录,所以这段代码不会返回损坏的链接:
for f in p.rglob("*"): if not f.exists(): print(f"{f} does not exist")
如果我使用iterdir()
,我必须对每个子目录递归执行它,并且在exists()
function 之上触发我需要捕获的异常 ( PermissionError
)。
>>> p = Path('dir1/link1') >>> p.is_symlink() True >>> p.exists()... PermissionError: [errno 13] Permission Denied: 'dir1/link1'
所以我认为这是我将 go 返回到os.walk
和os.path.exists()
的情况,因为这个 function 为断开的链接返回False
。
for root, _, files in os.walk(str(p)):
for f in files:
filename = os.path.join(root, f)
if os.path.islink(filename) and not os.path.exists(filename):
os.unlink(filename)
在这里正确使用pathlib
的任何解决方案?
所以我能找到的最好的pathlib
是下面的,与评论一致。
for dir in p.rglob("**/"):
for filename in dir.iterdir():
if filename.is_symlink():
try:
if not filename.exists():
print(f"{filename} is a broken link")
except PermissionError:
print(f"{filename} links to an file we cannot access")
两个print
语句可以用一个动作代替(如os.unlink
)。
虽然大多数时候我更喜欢使用pathlib
而不是os.path
,但在这种情况下os.path
实现更容易编写:
for root, _, files in os.walk(str(p)):
for f in files:
filename = os.path.join(root, f)
if os.path.islink(filename) and not os.path.exists(filename):
os.unlink(filename)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.