文件查询之二:文件属性查询

在上一个小程序中利用文件名和文件的后缀来查询所要的文件路径,这次通过文件的时间属性来对文件进行筛选工作。利用os模块下的stat()函数对文件的属性进行筛选。

这个函数返回的是一个nt.stat_result这样的列表,主要是文件的拥有者ID、组ID、文件类型、创建时间、修改时间和访问时间等值,这个程序主要是利用文件的创建

时间、修改时间和访问时间来对系统上的文件进行筛选。对应的选项主要是:              -ct : 创建时间                 -mt :修改时间                 -at : 访问时间 

2、选择的时间年月日时分秒的格式,即是要选择的时间是年月日时分秒、年月日或时分秒这几个的哪个时间格式进行比较:

-Ta : 年月日时分秒          -Tf : 年月日            -Ts : 时分秒                     -Tt : 时分

因为要查询的文件可能是通过某个时间或某一天的时间,更可以是某一个时间点的文件,所以采用这个选项来对文件进行查询。当然如果你想有更多的选项,你也可以自行添加。

那么接下就是代码的部分了,至于有些代码是与上个文件查询例子的代码在这里就不写出来了,不过也就是列举所有磁盘的那段代码没有而已。

首先是timeType函数的代码,该函数是选择以什么的时间格式来进行比较,但是没有作格式标准检查,比如:-Tf选项的时间格式是 yyyy:mm:dd,如果你胡乱输入一些时间

来进行比较也是可以的,比如输入 111:555:55这样的格式,是不会找到相应的文件的,因为根本不会存在这样时间的文件。所以如果要防止用户误输入的话,你最好设置一些

参数要求的规则,不符合的参数或数据是不被允许进行查询的,免得导致浪费时间或人力。具体代码如下:

def timeType(fileTime,searchTime,tType):

    fileTimeStr = ''
    if tType == '-Ta':
        fileTimeStr = ':'.join(str(t) for t in fileTime[0:6])   # 年月日时分秒
    elif tType == '-Tf':
        fileTimeStr = ':'.join(str(t) for t in fileTime[0:3])   # 年月日
    elif tType == '-Ts':
        fileTimeStr = ':'.join(str(t) for t in fileTime[3:6])   # 时分秒
    elif tType == '-Tt':
        fileTimeStr = ':'.join(str(t) for t in fileTime[3:5])   # 时分

    if fileTimeStr == searchTime:
        return True
    else:
        return False

这个函数主要是通过返回一个布尔值来作为判断的结果,如果返回为True,则表示该文件相应的时间是符合输入的要求;反之,该文件相应的时间与输入不相符。返回该布尔值

给主函数就可以在主函数中判断该文件路径是否符合要求,如果符合,将其写进文件中;反之,查询下个文件。主函数的代码如下:

def FindForTime(path,searchTime,parameter,tType):
    # search 格式 : yyyy:mm:dd:hh:mm:ss 
    count = 0   # 相当于计算系统中文件的个数
    name = searchTime.split(':')
    fileName = ''
    for i in name:
        fileName += str(i)
    # 打开文件,将其内容写进文件中
    # 保存为doc文件,保证文件过大也可以正常打开
    result = open('H:\\python\\working\\' + fileName + parameter[1:] + '.doc','a')

    listFile = os.listdir(path)   # listdir只是将当前目录下的文件或目录名列举出来,并包含有整个路径
    for file in listFile:
        count += 1
        try:
            file =os.path.join(path,file)
            if os.path.isfile(file):
                print('.'),
                if count % 100 == 0:
                    print
            else:
                FindForTime(path=file,searchTime=searchTime,parameter=parameter,tType=tType)
        except WindowsError,e:
            print('WindowsError',e)
        # 文件的属性
        fileInfo = os.stat(file)
        # 判断文件写进文档的标志   布尔值
        matchTime = ''
        try:
            if parameter == '-ct':
                Time = time.localtime(fileInfo.st_ctime)   # 创建时间
                matchTime = timeType(Time,searchTime,tType)
            elif parameter == '-at':
                Time = time.localtime(fileInfo.st_atime)   # 访问时间
                matchTime = timeType(Time,searchTime,tType)
            elif parameter == '-mt':
                Time = time.localtime(fileInfo.st_mtime)    # 修改时间
                matchTime = timeType(Time,searchTime,tType)
            else:
                pass
        except ValueError:
            pass

        if matchTime:
            result.write(file + '\n')
    result.close()

在这个函数中,开始的部分是新建一个文件来保存查询到的文件路径,接下来就是判断该路径是否为文件,然后就是查看文件的属性,语句是fileInfo = os.stat(file),这个就

可以获取到该程序所需要的文件属性,有创建时间、访问时间和修改时间属性,如果你需要比较其他的属性也可以添加进去作为比较的条件。获取到相应的时间后,使用time

模块下的localtime()函数就可以将通过os.stat()函数获取到的秒数(该秒数是从1970年1月1日0时0分0 秒算起的)转换成所需的格式,但是这个并不是所要的格式类型,

比如:fileInfo.st_ctime 的值是 1455434564.6751776,但是经过time.localtime()函数转换后就变成了time.struct_time(tm_year=2016, tm_mon=2, tm_mday=

14, tm_hour=15, tm_min=22, tm_sec=44, tm_wday=6, tm_yday=45, tm_isdst=0),这样的一个格式,这是一个可以使用for循环的迭代的可迭代对象。使用for遍历

就可以将其中所有的值遍历出来。最后就是判断该文件是否符合要求,如果符合,则将其写进文件。

对代码进行整合就可以将这些代码弄到上一个程序中,丰富程序的功能。这个程序还可以扩展更多的比较条件,比如:文件的用户ID,但是如果是windows系统可能看到所有的

文件都是一样的用户ID。如果结合stat模块来编写就可以更好的筛选不一样的文件类型,还可以将普通文件或链接文件等不同的文件类型区分开来,来查询相同类型的文件。

posted @ 2016-06-15 20:28  N_Vampire  阅读(783)  评论(0编辑  收藏  举报