【发布时间】:2016-04-08 13:22:40
【问题描述】:
在修复一个用户的 answer on AskUbuntu 时,我发现了一个小问题。代码本身很简单: os.walk ,递归获取目录中所有文件的总和。
但它会在符号链接上中断:
$ 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 忽略这些文件并避免对它们求和?
解决方案:
按照 cmets 中的建议,我添加了 os.path.isfile() 检查,现在它可以完美运行并为我的主目录提供正确的大小
$> cat test_code2.py
#! /usr/bin/python
import os
import sys
space = 0L # L means "long" - not necessary in Python 3
for subdir, dirs, files in os.walk(sys.argv[1]):
for f in files:
file_path = os.path.join(subdir, f)
if os.path.isfile(file_path):
space += os.stat(file_path).st_size
sys.stdout.write("Total: {:d}\n".format(space))
$> python test_code2.py $HOME
Total: 76763501905
【问题讨论】:
-
它不会在符号链接上中断。它在 broken 符号链接上中断。在任何情况下,您都可以使用
os.path.isfile测试文件名是否指向实际文件,然后再对其大小求和。 -
啊哈,敏锐,这就是代码在我的测试中有效的原因:)
-
@AnttiHaapala 那么解决方案应该是什么?删除损坏的符号链接?有没有办法在代码本身中解决这个问题?
-
只测试文件是否存在,如果不存在则跳过。
-
@AnttiHaapala 发布答案:)