os模块之os.path,序列化模块
os.path.abspath('路径'),把路径中不符合规范的格式"/"改成操作系统默认的格式,也能将能找到的相对路径改成绝对路径
path = os.path.abspath('E:/电影/楚门的世界') #这里是"/" print(path) >>> E:\电影\楚门的世界 #经过使用模块功能,"/"变成了"\"
os.path.split('路径'),将一个路径分成两段,返回一个元组,第一段是该文件的路径,第二段是个文件/文件夹
path= os.path.split('E:\百度网盘下载\Chrome') print(path)
>>> ('E:\\百度网盘下载', 'Chrome') path= os.path.split('E:\电影') print(path)
>>> ('E:\\', '电影')
上述都是保留两个文件,若现在有个需求,我只需要一个文件,要用os.path.dirname或者os.path.basename
区别:前者返回文件之前的路径,后者返回文件名
path= os.path.dirname('E:\百度网盘下载\Chrome') print(path) >>> E:\百度网盘下载 path = os.path.basename('E:\百度网盘下载\Chrome') print(path) >>> Chrome
os.path.exists("路径+文件名"):判断路径的文件/文件夹是否存在,返回true/false
res = os.path.exists(r'E:\百度网盘下载\Chrome') #存在的文件 print(res) >>> True res = os.path.exists(r'D:\电影\Chrome') #不存在的文件 print(res) >>>False
os.path.isabs():判断路径是否是绝对路径,返回true/false
res = os.path.isabs('Chrome') print(res) >>> False res = os.path.isabs(r'E:\百度网盘下载\Chrome') print(res) >>> True
os.path.isfile(path)
如果path是一个存在的文件,返回True。否则返回False。
os.path.isdir(path)
如果path是一个存在的目录,则返回True。否则返回False。
print(os.path.isdir(r'E:\百度网盘下载\Chrome')) >>> True print(os.path.isfile(r'E:\百度网盘下载\Chrome')) >>>False
os.path.join('path1',''path2'',''[path3,...]'','.....'):将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
path = os.path.join('E:\百度网盘下载\Chrome','哈哈哈','[制服诱惑]') print(path) >>>E:\百度网盘下载\Chrome\哈哈哈\[制服诱惑]
os.path.getsize("path"):查看path文件的大小
print(os.path.getsize(r'E:\百度网盘下载\Chrome')) print(os.path.getsize('E:\百度网盘下载')) >>> 4096 4096 #所有的文件夹 都至少是4096个字节,或是4096的整数倍
思路: 1.拿到这个文件夹下所有的文件夹 和 文件 2.如果是文件就取大小 2.1如果是文件夹 再打开这个文件夹 : 文件/文件夹 #方法一: 递归 import os def func(path): size_sum = 0 #拿到所有文件夹和文件 name_lst = os.listdir(path) #['temp', '三傻大闹好莱坞.mkv', '中国合伙人_超清.mp4', '忠犬八公.mp4', '搏击俱乐部.mkv', '楚门的世界.mp4', '穹顶之下_柴静.mp4', '肖申克的救赎.rmvb', '蝴蝶效应_第1部.mkv', '辛德勒的名单.mp4', '霸王别姬_超清.mp4'] #取出文件 for name in name_lst: path_abs = os.path.join(path,name) #将文件夹中的文件都与路径相拼接,更好的判断和计算 if os.path.isdir(path_abs): # 判断拼接后的目录是否存在,若存在证明是文件夹,再重复一次打开 size = func(path_abs) size_sum += size else: size_sum += os.path.getsize(path_abs) #若是文件,直接计算大小做累加 return size_sum ret = func("E:/电影") print(ret) >>> 17448775914
#堆栈思想 先进来后出去 lst = ["E:\python全栈15期"] size_sum = 0 while lst: #满足一个条件 path = lst.pop() #先进后出 path_list = os.listdir(path) #拿到所有目录 # print(path_list) for name in path_list: # print(name) path_abs = os.path.join(path,name) # print(path_abs) if os.path.isdir(path_abs): lst.append(path_abs) else: size_sum += os.path.getsize(path_abs) print(size_sum)
序列化json模块
json.dumps():序列化,将dict,str,list,int转化成str,方便处理
dic = {'key' : 'value','key2' : 'value2'} import json ret = json.dumps(dic) # 序列化 print(dic,type(dic)) >>> {'key': 'value', 'key2': 'value2'} <class 'dict'> print(ret,type(ret)) >>> {"key": "value", "key2": "value2"} <class 'str'>
json.loads():反序列化,将序列化后的数据转换成原来的数据类型
dic = {'key' : 'value','key2' : 'value2'} ret = json.dumps(dic) print(ret,type(ret)) >>> {"key": "value", "key2": "value2"} <class 'str'> res = json.loads(ret) # 反序列化 print(res,type(res)) >>> {'key': 'value', 'key2': 'value2'} <class 'dict'>
注意:json 在所有的语言之间都通用 : json序列化的数据 在python上序列化了 那在java中也可以反序列化,但是它能够处理的数据类型是非常有限的 : 字符串 列表 字典 数字
缺点:想要写入或取出某个文件中的文件,只能一个一个序列写入或一个个反序列读取,不能连续存取
pickle模块
功能和json是一样的,但是只能在python中使用,几乎支持Python中所有的数据类型
pickle中的dump和load可多次连续存取,序列化和反序列化只能是字节,若操作文件用"wb",'rb'模式操作,
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥