python笔记3--备份系统文件信息

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值