如何读取目录中的文件属性?

时间:2012-06-09 11:08:13

标签: python

例如,

import os
print os.listdir()

列出目录中的文件。

如何获取目录中所有文件的文件修改时间?

3 个答案:

答案 0 :(得分:37)

在查找目录中所有文件的文件属性时,如果您使用的是Python 3.5或更高版本,请使用os.scandir() function获取目录列表,其中包含文件属性。这可能比使用os.listdir()更高效,然后单独检索文件属性:

import os

with os.scandir() as dir_entries:
    for entry in dir_entries:
        info = entry.stat()
        print(info.st_mtime)

DirEntry.stat() function在Windows上使用时,不必进行任何额外的系统调用,文件修改时间已经可用。数据已缓存,因此额外的entry.stat()调用不会进行额外的系统调用。

您还可以使用pathlib module面向对象的实例来实现相同的目标:

from pathlib import Path

for path in Path('.').iterdir():
    info = path.stat()
    print(info.st_mtime)

在早期的Python版本中,您可以使用os.stat调用来获取文件属性,例如修改时间。

import os

for filename in os.listdir():
    info = os.stat(filename)
    print(info.st_mtime)

st_mtime是python 2.5及更高版本的浮点值,表示自纪元以来的秒数;使用timedatetime模块来解释这些模块以用于显示目的或类似目的。

请注意,值的精确度取决于您使用的操作系统:

  

st_atime,st_mtime和st_ctime属性的确切含义和解析取决于操作系统和文件系统。例如,在使用FAT或FAT32文件系统的Windows系统上,st_mtime具有2秒的分辨率,st_atime只有1天的分辨率。有关详细信息,请参阅操作系统文档。

如果你所做的只是获得修改时间,那么os.path.getmtime方法就是一个方便的捷径;它使用了os.stat方法。

但请注意,os.stat调用相对昂贵(文件系统访问),因此如果您对大量文件执行此操作,并且每个文件需要多个数据点,则最好使用{ {1}}并重复使用返回的信息,而不是使用os.stat便捷方法,其中每个文件将多次调用os.path

答案 1 :(得分:3)

如果您只想要修改时间,那么os.path.getmtime(filename)将为您提供。如果您使用带有参数的listdir,则还需要使用os.path.join

import os, os.path

for filename in os.listdir(SOME_DIR):
    print os.path.getmtime(os.path.join(SOME_DIR, filename))

答案 2 :(得分:0)

扩展 Martijn Pieters 的回答,值得注意的是 os.scandir 不是递归的,这意味着它不保证所请求目录的子目录中文件的最新 DirEntry.stat() 数据。

如果您正在寻找递归解决方案,使用 os.scandir 仍然比基于 os.walk 的方法快一个数量级。这是一个递归返回目录(包括所有嵌套文件和子目录)的最后修改时间的示例:

import os

def get_mtime(path, is_root=True):
    """Returns the last modified time for all files recursively within the `path` directory."""
    mtimes = []

    with os.scandir(path) as entries:
        for entry in entries:
            if entry.is_dir():
                mtimes.extend(get_mtime(entry.path, is_root=False))
            else:
                mtimes.append(entry.stat().st_mtime)

    return max(mtimes) if is_root else mtimes

这可以修改为聚合其他特定用例的相关数据。