python基础8-模块/time/random/OS/sys/JSON/XML
- 程序解耦
- tag的用法
-
模块(module)
- 一个.py文件就是一个模块(module)
- 模块包括:python标准库,第三方模块,应用程序自定义模块
- pycharm中,package中必须有__init__.py文件,direcory中没有
- package就是组织.py文件用的,一个包中放同一类型py文件
- 不同路径下可以有重名py文件
- namespace名字空间
- import(cal)做2件事,所以一般不在cal中定义逻辑函数,只定义功能函数
- 是把cal文件执行一遍
- 引用cal的变量名
- import cal, time,引用多个模块
- from cal import add,from cal import *,从cal中引入一个函数add,或者引入全部函数
- import sys,sys.path找到的路径,就是import寻找导入模块时的路径顺序。这是执行文件对应的路径,是解释器唯一能认识的路径,引入文件也是按照执行文件的路径进行查找,所以必须在执行文件中import所有.py。或者将所有引入模块的路径加入sys.path的列表中。
- sys.path.append(),临时修改环境变量,不是永久修改。永久修改得改系统path。把bin.py文件写在一个包中
-
import sys, os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #abspath拿到文件的绝对路径,dirname向外层找文件地址,两个外层就行 print(sys.path.append(BASE_DIR)) print(sys.path)
- from my_module import cal,从同层的my_module文件夹中找到cal模块
- bin.py是起始文件,main.py是逻辑功能主函数,其他功能函数放在别的地方
- from web.web1.web3 import cal,引用三层包的cal模块,用.连接。import后一般接模块,如果接包,则是执行包中的_init_文件
- _name_在执行文件中打印,就是字符串_main_。在被调用文件中执行,拿到的就是被调用文件的路径
- 测试代码时用,if __name__=='_main_'后接测试代码,如果匹配,说明当前处于测试环境,则执行代码。如果不匹配,说明当前是被调用状态,不执行测试代码
- 这句话放在bin.py文件,说明不想让bin成为被调用文件。bin可以提供接口,但不能执行我的主函数
-
time模块
- time.time()是时间戳,单位是秒,从19700101凌晨开始算。做计算用的
- 结构化时间
- time.localtime(),拿到的是当前时间,是字符时间。将时间戳时间即可转换为结构化时间。
- time.gmtime(),显示格林尼治时间,UTC
-
mktime(localtime)将结构化时间转换为时间戳。
- 字符串时间
- time.strftime('%Y-%m-%d %X',time.local.time()),将当前结构化时间转换为字符串时间,年月日小时
- time.strptime('2016:12:24:17:50:36', '%Y:%m:%d:%X),将字符串时间转换为结构化时间
- time.asctime(),将结构化时间转换为固定的字符串时间,使用python内置的字符串时间显示形式
- time.ctime(),将时间戳转换为固定形式的字符串时间
- time.sleep(),线程推迟指定的时间运行,单位为秒
- datetime.datetime.now(),显示另外一种字符串时间
- 给自创py文件起名字时,不要跟python内置py文件重名。time,sys文件特殊,不是py文件,是c 语言实现的,python解释器也是c语言,内置在python解释器中,直接在封装在了python中,即使重名,也不影响内置time运行
-
random模块
- random.random随机生成一个0到1的浮点数
- random.randint(1,3),在[1,3]之间取整数
- random.randrange(1,3),在[1,3)取整数
- random.choice([1,'23',[4,5]])三个内容中随机取一个,处理可迭代对象
- random.sample([11,22,33,44,55], 2)从列表中随机选择出两个值
- random.uniform(1,3)随机生成一个指定范围的浮点数据
- random.shuffle(),将列表打乱,例如洗扑克
-
import random def v_code(): ret = "" for i in range(5): num = random.randint(0, 9) alf = chr(random.randint(65, 122)) s = str(random.choice([num, alf])) ret += s return ret print(v_code())
-
OS模块
- dirname,abspath
- os.getward(),获取当前文件目录,即文件路径
- os.chdir()改变当前脚本工作目录,相当于shell下的cd。chdir('..')到上层目录
-
os.makedirs(
'dir1/dir2'
) 可生成多层递归目录
-
os.removedirs(
'dirname1'
) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
- os.stat('path/filename')获取文件/目录信息,其中st_size是文件占用的字节数
- os.linsep,输出当前平台使用的行终止符,win下为"\r\n",linux为"\n"
- os.system('bash comman'),运行shell命令,直接显示
-
os.path.dirname(),拿py文件的路径,os.path.basename(),拿py文件名
- a="路径1",b="路径2",os.path.join(a,b),将两个路径拼接,形成新的路径
-
sys模块
sys.argv 命令行参数
List
,第一个元素是程序本身路径。可以直接在调用py文件命令后边,加上输入参数,然后在函数内取值
-
sys.exit(n) 退出程序,正常退出时exit(
0
)
-
sys.version 获取Python解释程序的版本信息
-
sys.maxint 最大的
Int
值
-
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
-
sys.platform 返回操作系统平台名称
-
sys.stdin 输入相关
-
sys.stdout.write('#') 向屏幕输出相关内容
-
import time,sys for i in range(100): sys.stdout.write('#')#向终端输出内容 time.sleep(0.1)#与下一步结合,营造出动态显示的效果 sys.stdout.flush()#调用系统接口,从内存中向终端刷新
-
sys.stderror 错误相关
########################################
-
json模块
- 可以进行任何语言的数据交换,是从js语言中提取出来的
- 把字典存入文件,需要转换成字符串,提取出来需要加eval(),但是有局限性
- pickle可以存任何东西,函数变量,类变量
- json.dumps(dic),将任意数据类型封装成json字符串数据,无论dic什么引号,或者list,int,json都将其变为双引号字符串,称为json字符串。
- 除了存到磁盘上要保存成字符串,前端和后端互相传输时也要存成字符串
- json.load(),将json字符串还原成原数据类型
-
f = open('new_hello', 'w') dic_str = json.dumps(dic) f.write(dic_str) # 虽然二者等价,但dump只能用于文件操作,因此推荐用上一种 json.dump(dic.f)
- load与loads相比,少了f.read
- 只要字符串符合json规范,是双引号,就可以loads,非必须得dumps
-
pickle 模块
- 用法与json相同,只是转换成字节byte。文件打开是用wb。序列化和反序列化
- 支持序列的对象更多,除了字典等基本数据类型,还可以序列函数,类
- 序列化,把对象变量从内存中变成可存储或传输的过程
-
xml模块
- java中xml是必须的,也是包装语言,在金融领域以前用的多
- 标签语言,html语言也是标签语言,所有语法都是通过标签实现的。
- 有头有尾的标签叫非闭合标签,有头无尾的叫自闭合标签
- 增删改查
- import xml.etree.ElementTree as ET,引入xml模块
- ET.parse('xml_lesson.xml'),打开xml文件。要有对象概念,实体对象,可以调用方法,可以调用属性。
- 属性是对象下边的属性,是键值对,属性名和属性值。标签是通过属性完成信息传输的,属性用来解释标签名字。非闭合标签如有属性,一定加在首部位置
- root = tree.getroot(),拿到根结点
- root.tag,打印出节点的标签
-
for i in root: #print(i.tag)
for j in i:
print(j.tag)#对根结点进行遍历操作 - i.attrab,打印出对象的属性
- i.text取出标签内容
-
for node in root.iter('year') print(node.tag, node.text)#遍历root结点,只拿标签year的标签名和内容
-
#修改xml中year中的属性
import xml.etree.ElemenTree as ET
tree = ET.parse("xml_lesson")#导入文件 root = tree.getroot() for node in root.iter('year'): new_year = int(node.text) + 1#修改标签的内容 node.text = str(new_year) node.set("updated","yesy")#增加一个属性,包括属性名和属性值 tree.write("ET") -
删除country中rank中大于50的country
for country in root.findall('country'):#找到root中所有的country标签 rank = int(country.find('rank').text)#find找标签 if rank >50: root.remove(country) -
#创建一个xml文件 导入模块 new_xml = ET.Element("namelist")#创建一个namelist的标签 name = ET.SubElement(new_xml, "name",attrib={"enrolled":"yes"}
#在对象new_xml中创建一个标签,name,然后属性为...
!!!最后
et = ET.ElementTree(new_xml)#生成文档树
et.write("test.xml",encoding="utf_8",xml_declaration=True)#将内容写入文档对象中 -
shelve模块
- 与pickle模块类型,支持的处理对象也是有限的
- 将所有内容都处理成字典,按照字典的逻辑为大家存储数据