使 os.walk/os.stat 忽略权限被拒绝?

Make os.walk/os.stat ignore permission denied?

我制作了下面的 Python 2.4 脚本,该脚本扫描多个 LINUX 磁盘上的文件和 returns 它们的路径以及来自 os.stat 的人类可读的统计信息格式。

#!/usr/bin/env python

from datetime import datetime as dt
import os
import grp
import pwd

locations = ["/disk1", "/disk2", "/disk3", "/disk4", "/disk5", "/disk6"]

for item in locations:
    for root, dirs, files in os.walk(item):
        for fn in files:
            path = os.path.join(root, fn)
            stats = os.lstat(path)
            size = str(stats.st_size)
            user = pwd.getpwuid(stats.st_uid)[0]
            group = grp.getgrgid(stats.st_gid)[0]
            laccess = dt.fromtimestamp(stats.st_atime).strftime("%Y-%m-%d,%H:%M:%S")
            lmod = dt.fromtimestamp(stats.st_mtime).strftime("%Y-%m-%d,%H:%M:%S")
            c = ","
            t1 = ["0,", path, c, size, c, user, c, group, c, laccess, c, lmod,"\n"]
            outfile = open("/data/promigrate/DiskDashboard/Temp/filescan.csv", "at")
            outfile.write("".join(t1))
            outfile.close()

但是我发现我无法访问系统上的某些文件。

我收到以下错误:

abc12bmm -34> python files_scan.py
Traceback (most recent call last):
    File "files_scan.py", line 24, in ?
        stats = os.lstat(path)
OSError: [Errno 13] Permission denied: '/disk1/file5'

是否可以通过进程跳过权限被拒绝错误并继续下一个文件的方式来处理错误?

我一直在玩弄异常等,但没有任何乐趣,所以非常感谢任何帮助。

谢谢!

贾斯汀

问题是由于 os.lstat 没有对文件 运行 的权限,我一直在错误的地方使用 try-except。要处理错误,应按如下方式添加 try 和 except。

#!/usr/bin/env python

from datetime import datetime as dt
import os
import grp
import pwd

locations = ["/disk1", "/disk2", "/disk3", "/disk4", "/disk5", "/disk6"]

for item in locations:
    for root, dirs, files in os.walk(item):
        for fn in files:
            path = os.path.join(root, fn)
            try:
                stats = os.lstat(path)
                size = str(stats.st_size)
                user = pwd.getpwuid(stats.st_uid)[0]
                group = grp.getgrgid(stats.st_gid)[0]
                laccess = dt.fromtimestamp(stats.st_atime).strftime("%Y-%m-%d,%H:%M:%S")
                lmod = dt.fromtimestamp(stats.st_mtime).strftime("%Y-%m-%d,%H:%M:%S")
                c = ","
                t1 = ["0,", path, c, size, c, user, c, group, c, laccess, c, lmod,"\n"]
                outfile = open("/data/promigrate/DiskDashboard/Temp/filescan.csv", "at")
                outfile.write("".join(t1))
                outfile.close()
            except OSError:
                pass

现在处理错误并继续 运行ning。

感谢您的帮助!