Python 获取文件和文件夹属性信息及文件夹下所有的文件(os.stat() 和 os.path)

Python处理文件更新删除操作时,可能需要获取文件和文件夹信息,得到文件夹下的所有文件在进行处理,本文主要介绍 Python 中获取文件和文件夹属性信息,和文件夹下所有文件的方法,以及相关示例代码。

1、os.stat() 和 os.path

Python可以使用os.stat()os.path 获取文件和文件夹属性的相关信息。

1)os.stat()

import os
import time
import grp
import pwd

def formatTime(atime):
    import time
    return time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(atime))


#文件
fileinfo = os.stat("/etc/passwd")
#文件所有者
uid = fileinfo.st_uid
gid = fileinfo.st_gid
user = pwd.getpwuid(uid)[0]
group = grp.getgrgid(gid)[0]
print("user = ",user)
print("group = ",group)
print("最后一次访问时间:",formatTime(fileinfo.st_atime))
print("最后一次修改时间:",formatTime(fileinfo.st_mtime))
print("最后一次状态变化的时间:",formatTime(fileinfo.st_ctime))
print("索引号:",fileinfo.st_ino)
print("被连接数目:",fileinfo.st_dev)
print("文件大小:",fileinfo.st_size,"字节")
print("最后一次访问时间:",fileinfo.st_atime)
print("最后一次修改时间:",fileinfo.st_mtime)
print("最后一次状态变化的时间:",fileinfo.st_ctime)


#目录
fileinfo = os.stat("/etc")
#文件夹所有者
uid = fileinfo.st_uid
gid = fileinfo.st_gid
user = pwd.getpwuid(uid)[0]
group = grp.getgrgid(gid)[0]
print("user = ",user)
print("group = ",group)
print("最后一次访问时间:",formatTime(fileinfo.st_atime))
print("最后一次修改时间:",formatTime(fileinfo.st_mtime))
print("最后一次状态变化的时间:",formatTime(fileinfo.st_ctime))
print("索引号:",fileinfo.st_ino)
print("被连接数目:",fileinfo.st_dev)
print("文件大小:",fileinfo.st_size,"字节")
print("最后一次访问时间:",fileinfo.st_atime)
print("最后一次修改时间:",fileinfo.st_mtime)
print("最后一次状态变化的时间:",fileinfo.st_ctime)

2)使用os.path获取文件和文件夹属性信息

import os
import time

def formatTime(atime):
    import time
    return time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(atime))

# -------------------------------------------------------
#
filePath = '/etc/passwd'
print('\n'+filePath)
accessTime = os.path.getatime(filePath)
print('访问时间:',accessTime,time.ctime(accessTime))
print(formatTime(accessTime))

createTime = os.path.getctime(filePath)
print('创建时间:',createTime,time.ctime())
print(formatTime(createTime))

modifyTime = os.path.getmtime(filePath)
print('修改时间:',modifyTime,time.ctime(modifyTime))
print(formatTime(modifyTime))

# -------------------------------------------------------
#
filePath = '/etc'
print('\n'+filePath)
accessTime = os.path.getatime(filePath)
print('访问时间:',accessTime,time.ctime(accessTime))
print(formatTime(accessTime))

createTime = os.path.getctime(filePath)
print('创建时间:',createTime,time.ctime(createTime))
print(formatTime(createTime))

modifyTime = os.path.getmtime(filePath)
print('修改时间:',modifyTime,time.ctime(modifyTime))
print(formatTime(modifyTime))

2、获取文件夹下所有文件

Python中获取文件夹下所有文件可以使用os.listdir()通过递归遍历,也可以使用os.walk()获取,还可以使用os.scandir()获取文件夹下所有文件。os.scandir()在Python 3.5 及更高版本中可以使用。os.scandir()的效率比 os.walk()高。

1)使用os.listdir()递归遍历

import os
 
def readDir(dirPath):
    if dirPath[-1] == '/':
        print u'文件夹路径末尾不能加/'
        return
    allFiles = []
    if os.path.isdir(dirPath):
        fileList = os.listdir(dirPath)
        for f in fileList:
            f = dirPath+'/'+f
            if os.path.isdir(f):
                subFiles = readDir(f)
                allFiles = subFiles + allFiles #合并当前目录与子目录的所有文件路径
            else:
                allFiles.append(f)
        return allFiles
    else:
        return 'Error,not a dir'
print(readDir("/etc"))

2)使用os.walk()获取文件夹下所有文件

import os

def get_filepaths(directory):
    """
    将生成目录中的文件名  
    
    通过自顶向下或自底向上遍历树。 为每一个  
    
    根目录top的树中的目录(包括top本身),  
 
    它会产生一个3元组(dirpath, dirnames, filename)
    """
    file_paths = []  #该列表将存储所有完整的文件路径

    for root, directories, files in os.walk(directory):
        for filename in files:
            # 连接两个字符串以形成完整的文件路径。
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)  

    return file_paths 

   
full_file_paths = get_filepaths("/etc")
print(full_file_paths)

3)使用os.scandir()获取文件夹下所有文件

import os
with os.scandir("/etc") as i:
    for entry in i:
        if entry.is_file():
            print(entry.name)

推荐阅读
cjavapy编程之路首页