You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用os.walk遍历文件夹时文件类型均识别为file,如何修复?

修复os.walk遍历文件类型识别问题

问题根源

  1. 遍历范围不全:os.walk返回的dirList(子目录)和fileList(文件)是分开的,原代码只遍历了fileList,导致目录完全没被处理。
  2. 类型判断顺序错误:os.path.isfile()会自动跟随符号链接,若链接指向文件,会优先被判定为file,覆盖链接类型,必须先判断是否为链接。
  3. 目录处理逻辑错误:原代码尝试打开所有路径计算SHA-256,但目录无法被open()读取,会抛出异常。

修复后的代码

import os
import hashlib
import time
from prettytable import PrettyTable     # pip install prettytable

targetFolder = input("Enter Target Folder: ")

print("Walking: ", targetFolder, "\n")
tbl = PrettyTable(['AbsPath','Type', 'FileSize', 'UTC-Modified', 'UTC-Accessed', 'UTC-Created', 'SHA-256 HASH'])

for currentRoot, dirList, fileList in os.walk(targetFolder):
    # 处理目录
    for dirName in dirList:
        absPath = os.path.abspath(os.path.join(currentRoot, dirName))
        fileType = "Directory"
        stats = os.stat(absPath)
        fileSize = stats.st_size
        humanTimeLastModified = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(stats.st_mtime))
        humanTimeLastAccess = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(stats.st_atime))
        humanTimeLastCreated = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(stats.st_ctime))
        # 目录无法计算SHA-256,留空标注
        tbl.add_row([absPath, fileType, fileSize, humanTimeLastModified, humanTimeLastAccess, humanTimeLastCreated, "-"])
    
    # 处理文件和链接
    for fileName in fileList:
        absPath = os.path.abspath(os.path.join(currentRoot, fileName))
        # 先判断是否是符号链接
        if os.path.islink(absPath):
            fileType = "link"
            stats = os.lstat(absPath)  # 获取链接本身的属性,而非目标文件
            fileSize = stats.st_size
            # 链接不计算SHA-256,留空标注
            sha256_hash = "-"
        elif os.path.isfile(absPath):
            fileType = "file"
            stats = os.stat(absPath)
            fileSize = stats.st_size
            # 计算SHA-256
            with open(absPath, 'rb') as target:
                sha256Obj = hashlib.sha256(target.read())
                sha256_hash = sha256Obj.hexdigest()
        else:
            fileType = "unknown"
            stats = os.stat(absPath)
            fileSize = stats.st_size
            sha256_hash = "-"
        
        humanTimeLastModified = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(stats.st_mtime))
        humanTimeLastAccess = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(stats.st_atime))
        humanTimeLastCreated = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(stats.st_ctime))
        
        tbl.add_row([absPath, fileType, fileSize, humanTimeLastModified, humanTimeLastAccess, humanTimeLastCreated, sha256_hash])

tbl.align = "l"
print(tbl.get_string(sortby="FileSize", reversesort=True))

关键修改说明

  • 新增dirList遍历逻辑,单独处理目录类型。
  • 调整类型判断顺序:先判断os.path.islink(),避免链接被错误识别为文件。
  • 用os.lstat()替代os.stat()获取链接本身的属性(os.stat()会跟随链接到目标文件)。
  • 目录和链接不计算SHA-256,用"-"标注,避免打开路径时报错。

内容的提问来源于stack exchange,提问作者Connor Stackhouse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:42:07