python 常用模块

一 time

time 模块是普通的时间模块

1、time.time( )

​ 时间戳:从 1970 到现在经过的秒数

作用:用于时间间隔的计算

import time
print(time.time()) #1585531035.687209

2、time.strftime( )

​ 按照某种格式显示的时间: 2020-03-30 11:11:11

作用:用于展示时间

print(time.strftime('%Y-%m-%d %H:%M:%S')) #2020-04-04 19:40:28
print(time.srtftime('%Y-%m-%d %X')) #2020-03-30 09:18:39

#获取当前的年
print(time.strftime('%Y')) #2020

3、time.localtime()

结构化时间

作用: 用于获取时间的某一部分

res = time.localtime() 
print(res)#time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=9, tm_min=19, tm_sec=49, tm_wday=0, tm_yday=90, tm_isdst=0)

print(res.tm_year) #2020
print(res.tm_yday) #90

补充:

世界标准时间(结构化)与本地之间(东八区)对比

print(time.localtime()) #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=15, tm_min=21, tm_sec=44, tm_wday=0, tm_yday=90, tm_isdst=0)
print(time.gmtime())  #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=7, tm_min=20, tm_sec=39, tm_wday=0, tm_yday=90, tm_isdst=0)

#本地址时间(采用上海时间)比世界标准时间快了 8 个小时

时间显示格式为:星期 月份 天数 时间 年(通常用于 linux 系统)

import time
print(time.asctime()) #Mon Mar 30 15:46:23 2020

4、时间转换

image-20200404195458208

示例:

结构化时间 --------------》时间戳
import time
s_time= time.localtime() 
print(time.mktime(s_time)) #1585552579.0

时间戳--------------》结构化时间

tp_time = time.time()
print(time.localtime(tp_time)) #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=15, tm_min=25, tm_sec=15, tm_wday=0, tm_yday=90, tm_isdst=0)

print(time.localtime(333333333)) #time.struct_time(tm_year=1980, tm_mon=7, tm_mday=25, tm_hour=8, tm_min=35, tm_sec=33, tm_wday=4, tm_yday=207, tm_isdst=0)

结构化时间--------------》格式化的字符串形式的时间

s_time= time.local()
print(time.strftime('%Y-%m-%d %H:%M:%S', s_time)) #2020-03-30 15:29:04
#获取年月
print(time.strftime('%Y/%m')) #2020/03
# 获取年月日
print(time.strftime('%Y-%m-%d'))  #2020-03-30 

格式化字符串时间转换为------------》结构化时间

print(time.strptime('19888-03-03 11:11:11', '%Y-%m-%d, %H:%M:%S'))
#time.struct_time(tm_year=1988, tm_mon=3, tm_mday=3, tm_hour=11, tm_min=11, tm_sec=11, tm_wday=3, tm_yday=63, tm_isdst=-1)

必须掌握:format string(格式化时间) <---------->timestamp(时间戳)

格式化时间与时间戳格式不能直接互相转化,需要通过结构化时间

格式化时间 ----------》结构化时间-----------------》时间戳

'''
'1988-03-03 11:11:11'+7
'''
struct_time = time.strptime('1988-03-03 11:11:11', '%Y-%m-%d, %H:%M%s')  #格式化时间转换为结构化时间

timestamp = time.mktime(struct_time) +7 * 86400  #结构化时间转换为时间戳 +7
print(timestramp) #573966671.0

时间戳 --------------》结构化时间--------------------》格式化时间

timestamp = time.time()  #时间戳
struct_time = time.localtime(timestamp) #时间戳转换为结构时间
res = time.strftime('%Y-%m-%d, %X', struct_time) #2020-03-30 15:42:39

二 datetime

datetime 模块是基于 time 模块封装的一种比较便利的时间模块

1、获取当前时间

import datetime
print(datetime.datetime.now()) #2020-03-30 15:48:20.298178

#世界时间
print(datetime.datetime.utcnow()) #2020-03-30 07:48:20.298234

# 获取当前年月日
print(datetime.date.today() #2020-03-31

# 获取当前年月日时分秒
print(datetime.datetime.today()) #2020-03-31 00:39:08.038798

2、时间加减计算

日期/时间的计算:
日期时间 = 日期时间 “+” or “-” 时间对象
时间对象 = 日期时间 “+” or “-” 日期时间

print(datetime.datetime.now()) #2020-03-30 09:59:59.554466
#获取三天后的时间
print(datetime.datetime.now() + datetime.timedelta(days=3)) #2020-04-02 09:59:59.554513
#获取一周后的时间
print(datetime.datetime.now() + datetime.timedelta(weeks=1))#2020-04-06 09:59:59.554529

3、时间格式转换

时间戳转换为格式化时间

import datetime
pirint(datetime.datetime.fromtimestamp(333333)) #1970-01-05 04:35:33

时间替换

c_time = datetime.datetime.now()
print(c_time)
print(c_time.replace(minute=3, hour=2)) #时间替换

#结果展示
'''
2020-03-31 00:23:27.756616
2020-03-31 02:03:27.756616
'''

三 random

​ random:python提供的随机取值模块

1 random.random( ) #(0,1)

​ 取大于 0 且小于 1 之间的小数

import random
res = random.random()
#print(res) #0.0013748341683205156
print(res) #0.2427640714095196

2 random.randint(1, 3 ) #[1, 3]

取大于等于 1 且小于等于 3 之间的整数

res = random.randint(1, 3)
#print(res) #2
#print(res) #3
print(res) #1

3 random.randrange(1, 3) #[1, 3)

取大于等于1且小于 3 之间的整数

res = random.randrange(1, 3)
print(res) #1
print(res) #2

4 random.choice([111, 'aaa', [4,5]])

取列表中的一个元素: 1或者23或者[4,5]

res= random.choice([111, 'aaa', [4, 5]])  # 1或者23或者[4,5]
print(res) #[4,5]

5 random.sample([111,'aaa','bbb', [4,5]])

取列表中两个元素任意组合成列表

res = random.sample([111, 'aaa', 'bbb', [4, 5]])
#print(res) # ['aaa', 111]
print(res) #[111, 'bbb']

6 random.uniform(1, 3) #(1, 3)

取大于 1 小于 3 的小数

res = random.uniform(1, 3)
print(res) #2.913178536016434

7 random.shuffle( 可迭代对象)

打乱可迭代对象中的元素,相当于'洗牌'

item = [1,3,5,7,9]
res = random.shuffle(item)
print(res) #[7, 3, 5, 9, 1]

应用:随机验证码

随机验证码是由字母和数字组成

字母范围(A-Z) :随机生成字母:通过随机 ASCII 码数字,然后转换为字母

数字(0-9)

伪代码:

import random
res = ''
for i in range(6):
  从 26 个大写字母中随机取出一个 = chr(random.randint(65, 90))
  从 10 个数字中随机取出一个 = str(random.randint(0, 9))
  
  随机字符 = ransdom.choice([从26大写字母中随机取出一个,从10个数字中随机取出一个])
  res += 随机字符

示例:

import random

def make_code(size_num):
    '''
    验证功能
    size_num:验证码字符个数
    '''
    str1 = ''  #验证码
    for i in range(size_num):
        #大写字母
        str_upper = chr(random.randint(65, 90))  # A-Z
        #小写字母
        str_lower = chr(random.randint(97, 122))  # a-z
        #数字
        num = str(random.randint(0, 9)) #0-9
        res = random.choice((str_lower, str_upper, num))
        str1 += res
    return str1

res = make_code(6)

注:在ASCII码中,数字范围:97-122,对应小写字母;数字范围65-90,对应大写字母。

三 os

os 模块是与操作系统交互的一个接口

1、os.listdir('文件夹路径') 或 os.listdir('.')

获取某 一个文件夹下所有的子文件以及子文件夹的名字

res = os.list('.')
print(res) #['笔记.txt', '01 时间模块.py', 'run.py', '04 sys模块.py', '02 random模块.py', 'aaa', '03 os模块.py']

2、os.path.getsize('文件路径')

获取文件大小(单位:字节)

print(__file__) #/Users/tophan/Desktop/代码 2/03 os模块.py
size = os.path.getsize(__file__)
print(size) #187 字节

3、os.remove( )

删除一个文件

4、os.rename('oldname', 'newname')

重命名文件/目录

5、os.system('cmd 命令 ')

应用程序向操作系统发送 'cmd命令'请求 ,返回值是字符

因为返回值是字符,所以就会涉及字符编码问题

#查看根目录下的文件目录  应用程序-----》'ls /'
os.system('ls /') #运行 shell 命令  直接显示

6、os.environ

获取系统环境变量,应用软件级别的变量

#添加系统环境变量, 规定:key, value必须都为字符串类型
os.environ['aaaaaaaaaa']='111'
print(os.environ) #{字典类型}

7、os.path

1、返回文件路径中的目录(即文件所在的文件夹)

print(os.path.dirname(r'/a/b/c/d.txt')) #/a/b/c

2、返回文件路径中的文件名

print(os.path.basename(r'/a/b/c/d.txt')) #d.txt

3、判断文件是否存在

前提:与执行文件是同一级别

如果path 存在,返回 True,否则返回 False

print(os.path.isfile(r'笔记.txt')) #False  没有这个文件
print(os.path.isfile(r'os 模块.py')) #True 文件有
print(os.path.isfile(r'day22')) #False day22为文件夹
print(os.path.isfile(r'格式化输出.py')) #False  #不是同一目录下

4、判断文件夹是否存在

前提:与执行文件是同一级别

如果文件存在,返回 True,否则返回 False

print(os.path.isdir(r'aaa')) #False  #文件夹不存在
print(os.path.isdir('day22')) #False #不是同一级别
print(os.path.isdir('111')) #True

5、os.path.join( )

拼接路径

print(os.path.join(r'/a/b', 'c.txt')) #/a/b/c.txt
print(os.path.join('a','/','b','c','d')) #/b/c/d  #拼接路径,根目录(/)忽略

6、os.dir.dirname(__ file __)

获取执行文件的上一级目录

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
print(BASE_DIR) #/Users/tophan/2020_python

os.path.normpath(文件) :

按..或/ 的数目返回上一级目录

res = os.path.join(
    __file__,
    '..', ##.. 代表上一级
  	'..'   #.. 代表上一级
    )
#规范化路径,如..和/
print(res)  #/Users/tophan/2020_python/day22/os 模块.py/../..
BASE_DIR=os.path.normpath(res) #按..或/ 的数目返回上一级目录
print(BASE_DIR) #/Users/tophan/2020_python

了解:

在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
>>> os.path.normcase('c:/windows\\system32\\')   
'c:\\windows\\system32\\'  

7 os 用法具体案例

#项目的根目录、路径相关的值都用'常量'
BASE_PATH = os.path.dirname(DAY15_PATH)     
print(BASE_PATH) #/Users/tophan/python练习

# 路径的拼接:拼接文件'绝对路径'
TEST_PATH = os.path.join(DAY15_PATH, '火影写真.txt')  
print(TEST_PATH) #/Users/tophan/python练习/day15/老男孩教师写真.txt

# 判断'文件/文件夹'是否存在:若文件存在返回True,若不存在返回False
print(os.path.exists(TEST_PATH))# True
print(os.path.exists(DAY15_PATH))  # True

#判断'文件夹'是否存在
print(os.path.isdir(TEST_PATH)) #这里是文件,所以False
print(os.path.isdir(DAY15_PATH))#这里是文件夹,所以True

#创建文件夹
DIR_PATH = os.path.join(DAY15_PATH, '火影写真集') 
os.mkdir(DIR_PATH) 

#删除文件夹:只能删除'空的文件夹' 
DIR_PATH = os.path.join(DAY15_PATH, '火影写真集') 
os.rmdir(DIR_PATH) 

#获取某个文件夹中所有文件的名字 
DAY_PATH = '/Users/tophan/2020_python'
list1 = os.listdir(DAY_PATH)
print(list1) #拿到文件夹下所有文件或文件夹(只一层)
res = enumerate(list1) # <enumerate object at 0x10de27b40>   enumerate(可迭代对象)---->得到一个对像,对象有一个个的元组(索引,元素) 
print(list(res)) #得到列表套元组类型 [(0, 'day07'), (1, 'day09'), (2, 're.txt'), (3, 'day08'), (4, '火影写真集'), (5, '11.py'), (6, '深浅拷贝.py')...]

#可以通过列表索引方式拿到元组,再通过元组索引拿到对应文件或文件夹名
print(list(res)[1][1]) #day09

8 os常用方法大全

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  运行shell命令,直接显示
os.environ  获取系统环境变量
os.path.abspath(path)  返回path规范化的绝对路径
os.path.split(path)  将path分割成目录和文件名二元组返回
os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)  如果path是绝对路径,返回True
os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小

8、pathlib

pathlib:在 python3.5之后推出的一个新的模块

from pathlib import Path
# print(Path(__file__)) #/Users/tophan/2020_python/day22/os 模块.py
res = Path(__file__).parent.parent  #返回值是执行文件的上一级的上一级路径
print(res) #/Users/tophan/2020_python

Path('文件目录' / '文件名'):拼接文件路径

res=Path('/a/b/c') / 'd/e.txt'  #拼接文件路径 
print(res) #/a/b/c/d/e.txt

path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径

res=Path('/a/b/c') / 'd/e.txt'
print(res.resolve()) #把一个路径或路的序列解析为一个绝对路径

四 sys 模块

1 sys 模块

sys模块是与 python 解释器交互的模块

import sys
import os

# 获取当前的Python解释器的环境变量路径
print(sys.path)

# 将当前项目路径添加到环境变量中
BASE_PATH = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_PATH)

# 获取cmd终端的命令行  python3 py文件 用户名 密码
print(sys.argv)  # 返回的是列表['']

2 sys.argv

sys.argvs :相当于一个程序从外部接收参数的桥梁;它可以看做一个列表,列表内是外部输入的参数。其第一个元素是执行程序本身,后面才是外部给予的参数

应用场景:一般应用于使用终端执行 python 程序

#当在终端中执行python 文件时,通过sys.argv #获取的是解释器后参数值 ['run.py', 'a.txt', 'b.txt'] 

#通过sys.argv 可以获取的是解释器后参数值 ['run.py', 'a.txt', 'b.txt'] 
print(sys.argv) # 通过打印操作,终端可以打印出['run.py', 'a.txt', 'b.txt'] 

具体案例1:

1、检索文件夹大小的程序,要求执行方式如下 :python3.8 run.py 文件夹

'''
c.txt
hahaha
hahaha
hahaha
'''

'''sys.argv应用.py'''
import sys
import os

res = sys.argv[1]
if os.path.exists(res):
    size = os.path.getsize(res)
    print(f'文件大小为{size}') #文件大小为21
 

'''run.py'''  #执行文件
import os

#os.system('终端命令'):python向操作系统发送请求, 让操作系统执行终端命令
os.system('python3 /Users/tophan/2020_python/day22/sys.argv应用.py /Users/tophan/2020_python/day22/c.txt')

具体案例2:

通过 终端命令进行拷贝文本

import sys

#sys.argv:获取的是解释器后参数值
print(sys.argv) # 有这步打印操作,终端中才会显示['run.py', 'a.txt', 'b.txt'] 
src_file = sys.argv[1] #a.txt, 源文件路径
dst_file = sys.argv[2] #b.txt, 目标文件路径

with open('%s'%src_file, 'rb')as read_f,\
    open('%s'%dst_file, 'wb')as write_f:
    for line in read_f:
        write_f.write(line)

image-20200330213143610

进度条案例

具备知识:

print('[%-50s]' %'#') #[#                                                 ]
print('[%-50s]' %'##') #[##                                                ]
print('[%-50s]' %'###') #[###                                               ]

'''
指定列表宽度:50
- :右对齐
'#':打印#,不够就用空格填充
'''

示例:

res = ''
import time
for i in range(50):
    res += '#'
    time.sleep(0.3)
    print('\r[%-50s]%d'%(res, i+1), end='')  #\r:移至行首,即每次循环打印不会再在后面接着打印,都是会跳到行首打印,因此每次都会覆盖掉原来的打印内容,肉眼看起来像动态的进度

结果展示:
[############################################      ]44
[##################################################]50

进度条具体代码:

import time
def progress(percent):
    res_str = '#' * int(percent * 50)
    time.sleep(0.01)
    #\r:移至行首
    print('\r[%- 50s] %d%%' % (res_str, int(100 * percent)), end='')


total_size = 333333
recv_size = 0
while recv_size < total_size:
    # 未接收字的节数
    remaining_size = total_size - recv_size

    if remaining_size >= 1024:
        # 每次接收的字节数
        recv_size += 1024
    # 获取接收的数据占总数据多少百分比
    else:
        recv_size += remaining_size
    percent = recv_size / total_size
    progress(percent)

五 shutil 模块

高级的 文件、文件夹、压缩包 处理模块

1 shutil.copyfileobj(fsrc, fdst, length)

将文件内容拷贝到另一个文件中

import shutil
 
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w')) 

2 shutil.copyfile(src, dst)

拷贝文件

shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在 

3 shutil.copymode(src, dst)

仅拷贝权限。内容、组、用户均不变

shutil.copymode('f1.log', 'f2.log') #目标文件必须存在

4 shutil.copystat(src, dst)

仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

shutil.copystat('f1.log', 'f2.log') #目标文件必须存在

5 shutil.copy(src, dst)

拷贝文件和权限

import shutil

shutil.copy('f1.log', 'f2.log')

6 shutil.copy2(src, dst)

拷贝文件和状态信息

import shutil

shutil.copy2('f1.log', 'f2.log')

7 shutil.ignore_patterns(*patterns)

shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹

import shutil

shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除  

8 shutil.rmtree(path[, ignore_errors[, onerror]])

递归的去删除文件

import shutil 
shutil.rmtree('folder1')

9 shutil.move(src, dst)

递归的去移动文件,它类似mv命令,其实就是重命名。

import shutil

shutil.move('folder1', 'folder3')

10 shutil.make_archive(base_name, format,...)

创建压缩包并返回文件路径,例如:zip、tar

创建压缩包并返回文件路径,例如:zip、tar

  • base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
    如 data_bak =>保存至当前路径
    如:/tmp/data_bak =>保存至/tmp/
  • format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
  • root_dir: 要压缩的文件夹路径(默认当前目录)
  • owner: 用户,默认当前用户
  • group: 组,默认当前组
  • logger: 用于记录日志,通常是logging.Logger对象
#将 /data 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')

#将 /data下的文件打包放置 /tmp/目录
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data') 

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:

import zipfile

# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()

# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall(path='.')
z.close()

#zipfile压缩解压缩

import tarfile

# 压缩
>>> t=tarfile.open('/tmp/egon.tar','w')
>>> t.add('/test1/a.py',arcname='a.bak')
>>> t.add('/test1/b.py',arcname='b.bak')
>>> t.close()


# 解压
>>> t=tarfile.open('/tmp/egon.tar','r')
>>> t.extractall('/egon')
>>> t.close()

tarfile压缩解压缩

posted @ 2020-03-30 23:31  蛋蛋的丶夜  阅读(95)  评论(0编辑  收藏  举报