os模块之os.path,序列化模块

os.path.abspath('路径'),把路径中不符合规范的格式"/"改成操作系统默认的格式,也能将能找到的相对路径改成绝对路径

path = os.path.abspath('E:/电影/楚门的世界') #这里是"/"
print(path)   >>> E:\电影\楚门的世界  #经过使用模块功能,"/"变成了"\"
View Code

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)
方法二 while循环

序列化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'>
View Code

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'模式操作,


 

 

posted @ 2018-08-21 19:36  张大仙er  阅读(246)  评论(0编辑  收藏  举报