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