一、模块&包
1、模块
模块实质上就是一个Python文件,它是用来组织代码的。意思就是把Python代码写在里面,文件名就是模块的名称。例如:random.py,random就是模块的名称。
2、包
包又叫pageage,本质就是一个文件夹,和文件夹不一样的地方是它有一个__init__.py文件。包是从逻辑上来组织模块的,也就是说它是用来存放模块的。如果想导入其他目录下的模块,那么这个目录必须是一个包才能导入。
二、模块的分类
1、标准模块、标准包
Python自带的标准模块,直接import就能使用
例如:import string,random,datatime,json,os等
2、第三方模块
别人写好的一些模块,需要安装才能使用。
想要实现某个功能,可以先用百度搜索一下有没有第三方模块
3、自己写的Python文件
三、第三方模块的安装
1、傻瓜式的
(1)在命令行窗口直接输入:pip install pymysql(Python已加入环境变量)
pip在Python3.4以上的版本是自带的。但这种方式需要保证pycharm中的Project Interpreter路径是Python安装路径,否则即使窗口显示下载安装成功,依然不能成功import。因为在命令窗口下载下来的第三方包是存储在Python安装路径\\python3\\Lib\\site-packages下的,而pycharm import时,是从pycharm→File→Settings→Project Interpreter→设置的路径下\\Python\\Python36\\Lib\\site-packages去取第三方安装包的。
(2)若提示“pip命令不存在”
把Python安装目录下的Script目录的路劲加入到环境变量再执行pip命令
(3)若提示“Unknown or unsupported command \'install\'”
a、打开 C:\\strawberry\\perl\\bin\\
b、把这个目录下的pip 都改成其他的名字
(4)也可以直接在pycharm中安装第三方模块,这样安装的模块直接装在Project Interpreter→设置的路径下\\Python\\Python36\\Lib\\site-packages下,可以直接使用
如下图:
2、手动安装
(1)安装whl结尾的安装包
shift+右键,在此处打开命令行窗口(或者在地址栏中直接输入cmd)
pip install redis-2.10.6-py2.py3-none-any.whl
(2)安装tar.gz结尾的安装包
a、解压这个安装包
b、进入到这个解压之后的文件夹中
c、在命令行中输入:python setup.py install
3、卸载模块
pip uninstall pymysql
四、模块导入的顺序、实质
1、Python模块导入的顺序
(1)从当前目录下查找
(2)从Python环境变量中查找
2、导入模块的实质
把Python文件从头到尾执行一遍
3、导入当前目录下的Python文件(模块)
(1)第一种方式:
1 import test 2 a = test.name # 调用test文件中的name变量 3 test.my() # 调用test文件中的my()函数
(2)第二种方式
1 from test import my,name 2 a = name # 调用name变量 3 my() # 调用my函数
4、导入其他目录下的Python文件(模块)
(1)先把存放Python文件(模块)的目录加入环境变量
1 # 先把目录加入环境变量再导入 2 import sys 3 sys.path.insert(0,\'E:\\Python\\Script\') # 插到环境变量最前面,效率高
(2)导入Python文件(模块)
1 import test # 导入test模块 2 a = name # 调用name变量 3 my() # 调用my函数
当前目录下和环境变量下都有同一个文件时,会优先选择当前目录下的文件
常用模块
一、string模块
1 import string 2 print(string.ascii_letters) # 所有大小写字母 3 print(string.ascii_lowercase) # 所有小写字母 4 print(string.ascii_uppercase) # 所有大写字母 5 print(string.digits) # 所有数字 6 print(string.punctuation) # 所有特殊标点符号 7 print(string.printable) # 数字+字母+特殊字符
二、random模块
1 import random,string 2 pickts = [\'A\',\'J\',\'Q\',\'K\',2,3,4,5,6] 3 random.shuffle(pickts) # 洗牌,打乱顺序(只能传list) 4 print(pickts) 5 print(random.randint(1,10)) # 随机取1到10之间的整数 6 print(round(random.uniform(1,99),2)) # 随机取1到99之间的小数,小数点后保留2位小数 7 print(random.choice([1,2,3,4])) # 随机取数组当中的1个元素 8 print(random.sample(string.printable,5)) # 随机取N个元素,返回的是list
三、sys模块
1 import sys 2 print(sys.platform) # 判断是什么操作系统 3 sys.path.append(BASEPATH) # 将BASEPATH插到环境变量最后 4 sys.path.insert(0,BASEPATH) # 将BASEPATH插到环境变量最前面,效率高 5 print(sys.path) # Python的环境变量 6 print(sys.version) #获取Python解释程序的版本信息 7 print(sys.argv) # 用来获取命令行里面运行python文件的时候传入的参数,它返回的是一个list 8 # 它默认就有一个参数,就是当前文件的文件名,如果运行的命令在该python文件名后还带有参数则该参数也会加入返回的list当中 9 # 在命令行中输入:python sys模块.py --help 10 # 返回:[\'sys模块.py\', \'--help\']
下面写一段程序来说明sys.argv的作用
1、它是用来获取命令行里面运行python文件的时候传入的参数
2、它返回的是一个list
3、这个list默认就有一个参数,就是当前的这个文件名
1 import sys 2 command = sys.argv 3 print(command) 4 if len(command) > 1: 5 cmd1 = command[1] 6 if cmd1 == \'--help\': 7 print(\'这是个帮助文档\' 8 \'这个python文件是用来说明sys.argv的作用\') 9 elif cmd1 == \'os\': 10 print(\'当前的操作系统是%s\'%sys.platform) 11 else: 12 print(\'输入命令有误\') 13 else: 14 print(\'运行python文件的时候需要传入一个参数,\' 15 \'e.g:\' 16 \'python xx.py install\' 17 ) 18 # 输入命令:python tools.py --help 19 # 返回:[\'tools.py\', \'--help\'] 这是个帮助文档这个python文件是用来说明sys.argv的作用 20 # 输入命令:python tools.py os 21 # 返回:[\'tools.py\', \'--help\'] 当前的操作系统是win32 22 # 输入命令:python tools.py 23 # 返回:[\'tools.py\'] 运行python文件的时候需要传入一个参数,e.g:python xx.py install
四、os模块
1 # 对操作系统的一些操作 2 import os 3 print(os.getcwd()) # 获取当前目录 4 os.chmod(\'/usr/local\',777) # 给文件或目录加权限,一般用于linux操作系统(1执行2写4读) 5 print(os.chdir(\'../\')) # 更改目录,可以填相对路径和绝对路径(与Linux一样),没有返回值 6 print(os.makedirs(\'niuniu/python\')) # 递归创建目录,父目录不存在时会自动创建,可创建多层目录 7 print(os.mkdir(\'nhy\')) # 创建目录,父目录不存在会报错,只能创建一级目录 8 print(os.removedirs(\'niuniu/python\')) # 递归删除目录,只能删除空目录 9 print(os.rmdir(\'nhy\')) # 删除指定目录,只能删除空目录 10 print(os.remove(\'test.py\')) # 删除文件,只能删除文件 11 print(os.listdir(\'e:\\\\\')) # 列出目录下的所有文件和目录,放在一个list里面 12 print(os.rename(\'test\',\'test1\')) # 重命名 13 print(os.stat(\'day6.py\')) # 获取文件信息 14 print(os.sep) # 根据当前操作系统自动生成路径分隔符 15 print(\'day6\'+os.sep+\'x.py\') # 拼路径 16 print(os.linesep) # 当前操作系统的换行符 17 print(os.pathsep) # 当前系统环境变量中每个路径的分隔符,linux是冒号,Windows是分号 18 print(os.environ) # 当前系统的环境变量 19 print(os.name) # 当前系统名称,Windows是nt,Linux是posix 20 print(os.system(\'dir\')) # 执行操作系统命令,获取不到结果(返回的是0执行成功或1执行失败) 21 print(os.popen(\'ipconfig\').read()) # 执行操作系统命令,能获取到命令执行的结果 22 print(os.path.abspath(\'.\')) # 获取当前目录的绝对路径 23 print(os.path.abspath(__file__)) # 获取到当前文件的绝对路径 24 print(os.path.split(\'E:\\Pycharm_Workspace\\day6.py\')) # 分割路径和文件名,返回的是一个元组,第一个元素是路径,第二个元素是文件名 25 print(os.path.dirname(\'E:\\Pycharm_Workspace\\Python-code\')) # 获取父目录,获取它的上一级目录 26 print(os.path.basename(\'/usr/local/test.txt\')) # 获取路径的最后一级,如果是文件则显示文件 27 print(os.path.exists(\'E:\\Pycharm_Workspace\\Python-code\')) # 判断目录/文件是否存在 28 print(os.path.isabs(\'./\')) # 判断是否绝对路径 29 print(os.path.isfile(\'E:\\day6.py\')) # 判断是否是一个文件,判断文件是否存在 30 print(os.path.isdir(\'E:\\day6\')) # 判断是否是一个目录,判断目录是否存在 31 print(os.path.getsize(\'E:\\Pycharm_Workspace\\Python-code\\day6\\day6.py\')) # 获取文件的大小 32 print(os.path.join(r\'\\usr\',\'local\',\'tomcat\',\'logs\')) # 拼接成一个路径 33 os.walk(\'E:\\Pycharm_Workspace\') # 遍历目录,列出目录下所有的目录和文件,一层一层下去 34 # 循环三个变量,分别代表路径、目录和文件 35 # abs_path 当前循环的绝对路径 36 # dir 目录下面的所有文件夹 37 # file 目录下的所有文件 38 for abs_path,dir,file in os.walk(r\'E:\\Pycharm_Workspace\\Python-code\\day6\\test\'): 39 print(abs_path,dir,file)
练习一:在logs目录下创建子目录及在各目录下创建相关日志文件
1 import datetime,os 2 dirs = [\'tomcat\',\'nigix\',\'apache\',\'python\',\'app\',\'android\',\'ios\'] 3 base_path = \'E:\\logs\' 4 os.chdir(base_path) 5 for d in dirs: 6 os.mkdir(d) 7 os.chdir(d) 8 for i in range(10): 9 t = datetime.date.today() + datetime.timedelta(days=-i) 10 name = \'%s_%s.log\'%(d,t) 11 open(name,\'w\',encoding=\'utf-8\') 12 os.chdir(\'../\')
练习二:往日期为双数的日志文件中写内容
1 import os 2 for abs_path,dir,file in os.walk(\'E:\\logs\'): 3 for f in file: 4 day = f.split(\'.\')[0].split(\'-\')[-1] 5 if int(day)%2 == 0: 6 file_name = os.path.join(abs_path,f) # 拼接绝对路径 7 open(file_name,\'w\',encoding=\'utf-8\').write(\'测试中\')
五、time模块
1、基本用法:
1 import time 2 print(time.time()) # 获取当前时间戳:从unix元年到现在过了多少秒 3 print(time.gmtime()) # 取标准时区的时间(比中国时间慢8小时),返回的是时间元组 4 print(time.localtime()) # 取当前时区的时间,返回的是时间元组 5 print(time.strftime(\'%Y-%m-%d\')) # 获取格式化好的时间,格式可以自己定义 6 print(time.strftime(\'%Y-%m-%d %H:%M:%S\')) 7 print(time.strftime(\'%Y%m%d%H%M%S\')) 8 # Y:年,m:月,d:日,H:时,M:分,S:秒 9 time.sleep(5) # 等待时间5秒
2、把时间戳转换成格式化好的时间:
a、先把时间戳转换成时间元组
b、再把时间元组转换成格式化好的时间
1 import time 2 f = time.time() # 获取当前时间戳 3 s = time.localtime(f) # 把时间戳转换成时间元组 4 m = time.strftime(\'%Y-%m-%d %H:%M:%S\',s) # 把时间元组转换成格式化时间 5 print(m)
定义函数:把时间戳转换成格式化好的时间函数
a、不传入时间戳的话,返回当前格式化好的时间
b、传入时间的话,把时间戳转换成格式化好的时间并返回
1 def timestamp_to_fomat(timestamp=None,format=\'%Y-%m-%d %H:%M:%S\'): 2 if timestamp: 3 time_tuple = time.localtime(timestamp) 4 res = time.strftime(format,time_tuple) 5 else: 6 res = time.strftime(format) # 默认取当前时间 7 return res 8 print(timestamp_to_fomat()) 9 print(timestamp_to_fomat(1224398473)) 10 print(timestamp_to_fomat(1224398473,\'%Y-%m-%d\'))
3、把格式化好的时间转换成时间戳:
a、先把格式化好的时间转换成时间元组
b、再把时间元组转换成时间戳
1 import time 2 m = \'2017-1-1 18:20:11\' # 定义格式化好的时间 3 p = time.strptime(m,\'%Y-%m-%d %H:%M:%S\') # 把格式化好的时间转换成时间元组 4 s = time.mktime(p) # 把时间元组转换成时间戳 5 print(s)
定义函数:把格式化好的时间转换成时间戳函数
a、不传入格式化好的时间的话,返回当前时间戳
b、传入格式化好的时间的话,把格式化好的时间转换成时间戳并返回
1 def strToTimestamp(str=None,format=\'%Y-%m-%d %H:%M:%S\'): 2 if str: # 如果传了时间 3 tp = time.strptime(str,format) # 转成时间元组 4 res = time.mktime(tp) # 再转成时间戳 5 else: 6 res = time.time() # 默认取当前时间戳 7 return int(res) 8 print(strToTimestamp()) 9 print(strToTimestamp(\'2011-2-28 12:30:15\')) 10 print(strToTimestamp(\'2011-2-28\',\'%Y-%m-%d\'))
六、datetime模块
datetime模块和time模块类似,也可以进行时间戳、时间元组以及格式化时间的相互转换。
1 import datetime 2 print(datetime.datetime.today()) # 获取当前时间,精确到秒 3 print(datetime.date.today()) # 获取当前时间,精确到天 4 print(datetime.datetime.now()) # 当然时间格式化输出 5 res = datetime.date.today() + datetime.timedelta(days=5)#获取5天以后的时间 6 res = datetime.date.today() + datetime.timedelta(days=-5)#获取5天以前的时间 7 res = datetime.date.today() + datetime.timedelta(weeks=5)#获取5周以后的时间 8 res = datetime.datetime.today() + datetime.timedelta(hours=5)#获取5小时以后的时间 9 res = datetime.datetime.today() + datetime.timedelta(minutes=5)#获取5分钟以后的时间 10 res = datetime.datetime.today() + datetime.timedelta(seconds=5)#获取5秒钟以后的时间 11 res = datetime.datetime.today() + datetime.timedelta(days=5,hours=5,minutes=5,seconds=5,weeks=5) 12 print(res.strftime(\'%Y%m%d--%H%M%S\')) # 格式化时间输出 13 print(res)
七、hashlib模块
hashlib模块用于加密,加密方式包括:md5、sha1、sha224、sha256、sha384、sha512、blake2b、blake2s、sha3_224、sha3_256、sha3_384、sha3_512、
shake_128和shake_256等等。
1 import hashlib 2 passwd = \'jj123\' # 普通字符串不能加密,必须是二进制的bytes 3 f = passwd.encode() # 把字符串转成bytes(二进制)类型 4 m = hashlib.md5() # 定义加密方法 5 m.update(f) # 对bytes(二进制)类型字符串进行加密 6 print(m.hexdigest()) # 获取结果返回 7 # md5加密是不可逆的 8 9 # 其他加密方法,用法与md5一样,只是返回的密文长度不一样 10 passwd = \'jack\' 11 f = passwd.encode() 12 m = hashlib.sha256() 13 m.update(f) 14 print(m.hexdigest())
封装加密函数:
1 def my_md5(str): 2 new_str = str.encode() # 把字符串转成bytes类型 3 # new_str = b\'%s\'%str # 把字符串转成bytes类型 4 m = hashlib.md5() # 实例化md5对象 5 m.update(new_str) # 加密 6 return m.hexdigest() # 获取结果返回