Python手术室步行和符号链接

2024-05-15 04:07:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在修复一个用户的answer on AskUbuntu时,我发现了一个小问题。代码本身很简单:手术室步行,递归获取目录中所有文件的总和。在

但它在符号链接上断开了:

$ python test_code2.py $HOME                                                                                          
Traceback (most recent call last):
  File "test_code2.py", line 8, in <module>
    space += os.stat(os.path.join(subdir, f)).st_size
OSError: [Errno 2] No such file or directory: '/home/xieerqi/.kde/socket-eagle'

问题是,如何告诉python忽略这些文件并避免求和?在

解决方案

正如评论中所建议的,我添加了os.path.isfile()check,现在它工作得很好,并且为我的主目录提供了正确的大小

^{pr2}$

Tags: 文件path代码用户answerpytest目录
2条回答

正如anttihaapala在一篇评论中提到的,脚本不会在符号链接上中断,而是在断开的symlinks上中断。避免这种情况的一种方法是使用try/except

#! /usr/bin/python2
import os
import sys

space = 0L  # L means "long" - not necessary in Python 3
for root, dirs, files in os.walk(sys.argv[1]):
    for f in files:
        fpath = os.path.join(root, f)
        try:
            space += os.stat(fpath).st_size
        except OSError:
            print("could not read "+fpath)

sys.stdout.write("Total: {:d}\n".format(space))

作为一个副作用,它提供了关于可能断开的链接的信息。在

是的,os.path.isfile是个好办法。然而,以下版本的可能更节省内存。在

for subdir, dirs, files in os.walk(sys.argv[1]):
    paths = (os.path.join(subdir, f) for f in files)
    space = sum(os.stat(path).st_size for path in paths if os.path.isfile(path))

相关问题 更多 >

    热门问题