使用os.walk遍历文件夹时文件类型均识别为file,如何修复?
修复os.walk遍历文件类型识别问题
问题根源
- 遍历范围不全:
os.walk返回的dirList(子目录)和fileList(文件)是分开的,原代码只遍历了fileList,导致目录完全没被处理。 - 类型判断顺序错误:
os.path.isfile()会自动跟随符号链接,若链接指向文件,会优先被判定为file,覆盖链接类型,必须先判断是否为链接。 - 目录处理逻辑错误:原代码尝试打开所有路径计算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
相关产品推荐
相关产品推荐

