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


    在上一个小程序中利用文件名和文件的后缀来查询所要的文件路径,这次通过文件的时间属性来对文件进行筛选工作。利用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 + '
    ')
        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模块来编写就可以更好的筛选不一样的文件类型,还可以将普通文件或链接文件等不同的文件类型区分开来,来查询相同类型的文件。

    http://www.cnblogs.com/GHost-Ma/
  • 相关阅读:
    内核模式之事件
    用户模式之临界区
    _stdcall与_cdecl区别
    列出系统所有进程
    一道多线程的题
    进程间通信三:父进程传参数与子进程返回值
    进程间通信二:管道技术之命名管道
    进程间通信二:管道技术之匿名管道
    进程间通信二:管道技术之输入输出重定向
    补充实验1:dhcp服务器分配网关-路由器的静态路由优先级
  • 原文地址:https://www.cnblogs.com/GHost-Ma/p/5588819.html
Copyright © 2020-2023  润新知