python笔记3--备份系统文件信息
1、功能
本文主要将电脑特定文件夹文件信息做一个备份,以便于在特定条件下了解文件存储信息;主要实现三个小功能,1-通过简单的目录结构输出特定文件夹的所有文件名称,2-获取所有文件信息并以json格式保存到文本文件,3-读取保存的文件并将其转换为dict数据。
2、代码
此处采用json存放数据,其中文件夹最外层为数组形式,即为[],数组内每条数据都以一条json存储,若文件夹内包含文件夹,则在该条json中增加一个数组类型的subDir字段,该字段再嵌套的存储相应的数据;最终通过一个json数组保存了该目录下的所有数据。
python常见文件、文件夹处理函数:
os.path.abspath(path) #返回绝对路径
os.path.basename(path) #返回文件名
os.path.commonprefix(list) #返回多个路径中,所有path共有的最长的路径。
os.path.dirname(path) #返回文件路径
os.path.exists(path) #路径存在则返回True,路径损坏返回False
os.path.lexists #路径存在则返回True,路径损坏也返回True
os.path.expanduser(path) #把path中包含的"~"和"~user"转换成用户目录
os.path.expandvars(path) #根据环境变量的值替换path中包含的”$name”和”${name}”
os.path.getatime(path) #返回最后一次进入此path的时间。
os.path.getmtime(path) #返回在此path下最后一次修改的时间。
os.path.getctime(path) #返回path的大小
os.path.getsize(path) #返回文件大小,如果文件不存在就返回错误
os.path.isabs(path) #判断是否为绝对路径
os.path.isfile(path) #判断路径是否为文件
os.path.isdir(path) #判断路径是否为目录
os.path.islink(path) #判断路径是否为链接
os.path.ismount(path) #判断路径是否为挂载点()
os.path.join(path1[, path2[, ...]]) #把目录和文件名合成一个路径
os.path.normcase(path) #转换path的大小写和斜杠
os.path.normpath(path) #规范path字符串形式
os.path.realpath(path) #返回path的真实路径
os.path.relpath(path[, start]) #从start开始计算相对路径
os.path.samefile(path1, path2) #判断目录或文件是否相同
os.path.sameopenfile(fp1, fp2) #判断fp1和fp2是否指向同一文件
os.path.samestat(stat1, stat2) #判断stat tuple stat1和stat2是否指向同一个文件
os.path.split(path) #把路径分割成dirname和basename,返回一个元组
os.path.splitdrive(path) #一般用在windows下,返回驱动器名和路径组成的元组
os.path.splitext(path) #分割路径,返回路径名和文件扩展名的元组
os.path.splitunc(path) #把路径分割为加载点与文件
os.path.walk(path, visit, arg) #遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数
os.path.supports_unicode_filenames #设置是否支持unicode路径名
os.path.abspath(__file__) # 获取执行py文件的绝对路径(包括文件名)
os.path.dirname(os.path.abspath(__file__)) # 获取执行py文件的绝对路径目录(不包括文件名)
注意:sys.argv[0] 在main中可以使用,脱离了main后的其它函数使用时候需要传参数,否则返回为空
python源码:
import os
import datetime
import time
import json
def PrintFiles(pathName='E:\\',isTop=True,strSpace=''):
'''
按照简单目录结构输出文件名称
'''
retList = []
rootdir = pathName
try:
fileList = os.listdir(rootdir)
for i in range(0,len(fileList)):
pname = os.path.join(rootdir,fileList[i])
if os.path.isfile(pname):
if isTop:
print('F:',pname)
else:
print(strSpace+'\t'+'F:',pname)
if os.path.isdir(pname):
if isTop:
print('D:',pname)
else:
print(strSpace+''+'D:',pname)
PrintFiles(pname,False,strSpace+'\t')
if os.path.islink(pname):
if isTop:
print('L:',pname)
else:
print(strSpace+'\t'+'L:',pname)
if os.path.ismount(pname):
if isTop:
print('M:',pname)
else:
print(strSpace+'\t'+'M:',pname)
except:
print('Not Access!')
def GetFileDict(pathName):
'''
该dict用于保存文件或者文件夹的基础信息
'''
ret = {}
ret['name'] = os.path.basename(pathName)
ret['size'] = os.path.getsize(pathName)/1024 #默认为byte,此时单位为KB
ret['lastModifyTime'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(os.path.getmtime(pathName))))
ret['pathName'] = pathName
return ret
def PrintFilesV2(pathName='E:\\'):
retList = []
rootdir = pathName
fileList = os.listdir(rootdir)
for i in range(0,len(fileList)):
pname = os.path.join(rootdir,fileList[i])
if os.path.isfile(pname):
tmpDict = GetFileDict(pname)
tmpDict['type']='file'
retList.append(tmpDict)
if os.path.isdir(pname):
tmpDict = GetFileDict(pname)
tmpDict['type']='dir'
try:
retFiles = PrintFilesV2(pname)
tmpDict['subDir'] = retFiles
sumsize = 0.0
for i in retFiles: #统计文件大小
sumsize = sumsize+i['size']
tmpDict['size'] = tmpDict['size']+sumsize
except:
tmpDict['subDir'] = [] #无法访问文件夹暂时设置内容为空
print('Not Access!',pname)
retList.append(tmpDict)
if os.path.islink(pname):
tmpDict = GetFileDict(pame)
tmpDict['type']='link'
retList.append(tmpDict)
if os.path.ismount(pname):
tmpDict = GetFileDict(pname)
tmpDict['type']='mount'
retList.append(tmpDict)
return retList
def TestPrintFilesV2_1():
'''
将pathName目录的文件信息保存到对应的json文件中
'''
pathName = 'D:\\' #此处需要使用绝对路径
print('Save:',pathName)
retDict = PrintFilesV2(pathName)
#print(pathName+' Information:\n',retDict)
#retJson = json.dumps(retDict) #dumps将dict转为json字符串
#print(retJson)
fileName = pathName+'_'+time.strftime("%Y%m%d_%H%M%S",time.localtime(time.time()))+'.json'
fileName = fileName.replace(':\\','')
fileName = fileName.replace('\\','_')
with open(fileName, 'w',encoding='utf-8') as f:
json.dump(retDict, f,ensure_ascii=False) #dump将dict转为json字符串并存储到对应的文件中
print('fileName',fileName)
def TestPrintFilesV2_2():
'''
TestPrintFilesV2_2 中保存的json文件信息还原为dict类型数据
'''
pathName = 'E:\\Test.json' #此处需要使用绝对路径
retDict = None
with open(pathName,'r',encoding='utf-8') as f:
tmpDict = json.load(fp=f)
retDict = tmpDict
print(retDict)
if __name__ =='__main__':
print('Test File Browser!')
#PrintFiles('E:\\Code\\Python',True)
#TestPrintFilesV2_1() #Files2JsonFile
#TestPrintFilesV2_2() #JsonFile2Dict
3、说明
本代码当前测试环境为win下的python3.6.6。