os模块
os.path.abspath(path) 返回path规范化的绝对路径
把路径中不符合规范的/改成操作系统默认的格式
import os path = os.path.abspath(r"C:/Users/asus/PycharmProjects/untitled/day19/练习.py") print(path) #结果:C:UsersasusPycharmProjectsuntitledday19练习.py
能够给能找到的相对路径改成绝对路径
import os path = os.path.abspath("练习.py") print(path)
os.path.split(path) 将path分割成目录和文件名二元组返回
就是把一个路径分成两段,第二段是一个文件/文件夹
import os path = os.path.split("C:/Users/asus/PycharmProjects/untitled/day19/练习.py") print(path) #结果:('C:/Users/asus/PycharmProjects/untitled/day19', '练习.py') path = os.path.split("C:/Users/asus/PycharmProjects/untitled/day19") print(path) #结果:('C:/Users/asus/PycharmProjects/untitled', 'day19')
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
import os ret1 = os.path.dirname("C:/Users/asus/PycharmProjects/untitled/day19/练习.py") print(ret1) #结果:C:/Users/asus/PycharmProjects/untitled/day19
os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
import os ret2 = os.path.basename("C:/Users/asus/PycharmProjects/untitled/day19/练习.py") print(ret2) #结果:练习.py
如果你两个值都需要 os.path.split
如果你只要一个值 os.path.dirname/os.path.basename
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
判断文件/文件夹是否存在
import os res = os.path.exists("练习.py") print(res) #结果:True
os.path.isabs(path) 如果path是绝对路径,返回True
import os res1 = os.path.isabs('练习.py') res2 = os.path.isabs(r'C:/Users/asus/PycharmProjects/untitled/day19/练习.py') print(res1) # False print(res2) # True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
import os print(os.path.isdir(r'C:/Users/asus/PycharmProjects/untitledaaa')) # False print(os.path.isfile(r'C:/Users/asus/PycharmProjects/untitledaaa')) # False print(os.path.isfile('C:/Users/asus/PycharmProjects/untitledday01')) # False print(os.path.isdir('C:/Users/asus/PycharmProjects/untitledday01')) # True
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
import os path = os.path.join('C:/Users/asus/PycharmProjects/untitled','bbb') print(path) #结果:C:/Users/asus/PycharmProjects/untitledbb
os.path.getsize(path) 返回path的大小
import os size= os.path.getsize(r'C:/Users/asus/PycharmProjects/untitled/day19/练习.py') # 查看文件大小 print(size) # 结果: 7826
使用python代码统计一个文件夹中所有文件的总大小
递归 import os def func(path): sum = 0 name_lst = os.listdir(path) for name in name_lst: path_abs = os.path.join(path,name) if os.path.isdir(path_abs): size = func(path_abs) sum += size else: sum += os.path.getsize(path_abs) return sum ret =func(r'C:/Users/asus/PycharmProjects/untitled') print(ret) # 结果: 192435586 循环 lst = [r'C:/Users/asus/PycharmProjects/untitled'] sum = 0 while lst: path = lst.pop() path_list = os.listdir(path) for name in path_list: abs_path = os.path.join(path,name) if os.path.isdir(abs_path): lst.append(abs_path) else: sum +=os.path.getsize(abs_path) print(sum) # 结果: 192435586
exec('字符串数据类型的python代码')
eval('执行字符串数据类型的python代码')
os模块所做的事情
定制了很多方法 间接的帮助你去调用操作系统的命令 获得结果
然后帮助你分析整理成我们需要的数据类型的形态
你也可以os.popen/os.system直接取调用操作系统的命令 获得结果
但是 分析和整理的工作需要你自己做
用os模块的方法本身能够完成的功能我们就用定制好的方法就够了
如果有一天 你发现os模块定制好的功能解决不了我们的问题了
而刚好操作系统的命令能够很好地帮助我们解决问题
这个时候就用os.popen/os.system
二.序列化模块
序列化 : 字符串 bytes
序列 : 列表 元组 字符串 bytes
把其他的数据类型 转换成 字符串 bytes 序列化的过程
json
import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} #注意,json转换完的字符串类型的字典中的字符串是由""表示的 dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] loads和dumps
load和dump
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)
json 在所有的语言之间都通用 : json序列化的数据 在python上序列化了 那在java中也可以反序列化
能够处理的数据类型是非常有限的 : 字符串 列表 字典 数字
字典中的key只能是字符串
向文件中记录字典
import json dic = {'key' : 'value','key2' : 'value2'} ret = json.dumps(dic) # 序列化 with open('json_file','a') as f: f.write(ret)
从文件中读取字典
import json with open('json_file','r') as f: str_dic = f.read() dic = json.loads(str_dic) print(dic.keys())
dump load 是直接操作文件的
import json dic = {'key1' : 'value1','key2' : 'value2'} with open('json_file','a') as f: json.dump(dic,f) with open('json_file','r') as f: dic = json.load(f) print(dic.keys())
把一个一个的字典放到文件中,再一个一个取出来
import json dic = {'key1' : 'value1','key2' : 'value2'} with open('json_file','a') as f: str_dic = json.dumps(dic) f.write(str_dic+' ') str_dic = json.dumps(dic) f.write(str_dic + ' ') str_dic = json.dumps(dic) f.write(str_dic + ' ')
with open('json_file','r') as f: for line in f: dic = json.loads(line.strip()) print(dic.keys())
json
dumps loads
在内存中做数据转换 :
dumps 数据类型 转成 字符串 序列化
loads 字符串 转成 数据类型 反序列化
dump load
直接将数据类型写入文件,直接从文件中读出数据类型
dump 数据类型 写入 文件 序列化
load 文件 读出 数据类型 反序列化
json是所有语言都通用的一种序列化格式
只支持 列表 字典 字符串 数字
字典的key必须是字符串
json的格式化输出
import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2)
pickle
1. 支持在python中几乎所有的数据类型
import pickle dic = {(1,2,3):{'a','b'},1:'abc'} ret = pickle.dumps(dic) print(ret)
2. dumps 序列化的结果只能是字节
print(pickle.loads(ret))
3.只能在python中使用
4.在和文件操作的时候,需要用rb wb的模式打开文件
5.可以多次dump 和 多次load