人生三问
- 1. 内置模块是什么
内置模块就是python编译器里面自带的一些模块,我们没有必要去写,但是可以直接使用! - 2. 为什么要使用内置模块
在日常工作中,我们需要去写一些模块去解决一些特定的功能,但是对于一些比较常用的功能,python解释器已经帮我们写好了,你说你是想直接拿来就用呢?还是再自己去写一个模块,当然是直接用啊。 - 3. 内置模块怎么使用
内置模块和我们自定义的模块是一样的,通过import和from导入进行使用
介绍的模块:
- time
- datetime
sys
shutil
random
os
模块一: time
1. 时间戳
- >>> time.time() # 代表的是从1970年开始到现在经过的秒数
- 1539593357.4160235
2. 结构化时间
- >>> time.localtime() # 通过localtime方法获得当前系统的结构化时间
- time.struct_time(tm_year=2018, tm_mon=10, tm_mday=15, tm_hour=16, tm_min=49, tm_sec=56, tm_wday=0, tm_yday=288, tm_isdst=0)
- >>> a = time.localtime()
- >>> a.tm_year # 可以通过.后面跟上属性查看相应的值
- 2018
3. 格式化字符串时间
- >>> time.strftime('%Y-%m-%d %X') # 通过输入%多少来获得对应的值
- '2018-10-15 16:57:24'
- >>>
格式化的标准:

- %a Locale’s abbreviated weekday name.
- %A Locale’s full weekday name.
- %b Locale’s abbreviated month name.
- %B Locale’s full month name.
- %c Locale’s appropriate date and time representation.
- %d Day of the month as a decimal number [01,31].
- %H Hour (24-hour clock) as a decimal number [00,23].
- %I Hour (12-hour clock) as a decimal number [01,12].
- %j Day of the year as a decimal number [001,366].
- %m Month as a decimal number [01,12].
- %M Minute as a decimal number [00,59].
- %p Locale’s equivalent of either AM or PM. (1)
- %S Second as a decimal number [00,61]. (2)
- %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. (3)
- %w Weekday as a decimal number [0(Sunday),6].
- %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. (3)
- %x Locale’s appropriate date representation.
- %X Locale’s appropriate time representation.
- %y Year without century as a decimal number [00,99].
- %Y Year with century as a decimal number.
- %z Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59].
- %Z Time zone name (no characters if no time zone exists).
- %% A literal '%' character.
格式化字符串的时间格式
4. 三种时间格式之间的转换
因为计算机认识的时间格式只有时间戳的格式,但是对于我们人类而言,时间戳的格式又太难懂,因此我们把时间戳的格式转换成【结构化的时间】或者是【格式化字符串的时间】类型,转换关系如下。

5. 时间的转换
- #------------------------------------------------按照图1中的关系进行时间的转换
# 时间之间的转换操作 -
- # 定义三个类型的时间
- a = time.time() # 得到时间戳
- b = time.localtime() # 结构化时间
- c = time.strftime('%Y-%m-%d %H-%M-%S') # 格式化字符串时间
-
- # 结构化时间转为时间戳和格式化字符串时间的两种方式
- d = time.mktime(b)
- e = time.strftime('%Y-%m-%d', b)
- # 时间戳转换成结构化时间
- f = time.localtime(a)
- g = time.gmtime(a)
- # 格式化字符串时间转化为结构化时间
- h = time.strptime(c, '%Y-%m-%d %H-%M-%S') # c是什么样格式的后面的格式就要写成什么样格式的

6. 图二的两种方式其实就是把时间转换成外国人能够接受的时间
- # ---------------------------按照图二的方式进行时间的转换
- # 如果不进行传参,ctime和asctime得到得是一样的效果,都是转换成【week month day time year】
-
- >>> time.asctime()
- 'Mon Oct 15 18:23:37 2018'
- >>> time.ctime()
- 'Mon Oct 15 18:23:44 2018'
- >>>
-
- # 如果进行传参
- >>> a = time.time() # 先得到时间戳
- >>> b = time.localtime() # 得到结构化时间
- >>> time.asctime(b) # 通过asctime把结构化时间转换成固定的外国人接受的时间
- 'Mon Oct 15 18:28:12 2018'
- >>> time.ctime(a) # 通过ctime将时间戳转换成外国人能够接受的时间
- 'Mon Oct 15 18:28:06 2018'
- >>>
模块二:datatime
- >>> print(datetime.datetime.now()) # 通过datetime的now方法获取当前时间格式
- 2018-10-15 18:40:17.028194
- >>> datetime.datetime.fromtimestamp(time.time())
- datetime.datetime(2018, 10, 15, 18, 40, 34, 551056)
- >>> print(datetime.datetime.fromtimestamp(time.time())) # 通过fromtimestamp转换成相应的时间格式
- 2018-10-15 18:40:57.722764
- >>>
datetime重要的作用,用来做时间的加减
- print(datetime.datetime.now()) # 展示现在的时间 格式为 【year:month:day hour:minute:second 】
- print(datetime.datetime.fromtimestamp(time.time())) # 将时间戳转换成datetime的形式
- # 当前时间加减三天
- print(datetime.datetime.now() + datetime.timedelta(3))
- print(datetime.datetime.now() + datetime.timedelta(-3))
- # 当前时间加减三个小时
- print(datetime.datetime.now() + datetime.timedelta(hours=3))
- print(datetime.datetime.now() + datetime.timedelta(hours=-3))
- # 当前时间加减三十分钟
- print(datetime.datetime.now() + datetime.timedelta(minutes=30))
- print(datetime.datetime.now() + datetime.timedelta(minutes=-30))
替换:
- c_time = datetime.datetime.now()
- print(c_time, type(c_time))
- print(c_time.replace(month=11, year=2020, minute=10))
- print(c_time)
模块三: sys模块
- '''
- sys模块(python解释器相关的)
- 1. sys.argv # 这个是传入的参数,返回的是列表的形式,第一个是当前执行文件的名称
- 2. sys.path # 系统的环境变量,可以通过append方法进行更改
- 3. sys.modules # 内存已经加载的模块,以字典的形式存在
- 4. sys.version # 解释器的版本
- 5. sys.platform # 当前执行的平台
- 6. sys.exit() # 退出当前执行的python解释器
- # 了解
- 7. sys.api_version # api版本号
- 8. sys.maxsize # 最大值得整数32位为 2 ** 32 - 1 64位为2 ** 64 -1
- 9. sys.maxunicode # 最大的unicode 0x10FFFF
- '''

- >>> import sys
- >>> sys.version
- '3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]'
- >>> sys.api_version
- 1013
- >>> sys.platform
- 'win32'
- >>> sys.path
- ['', 'E:\\software\\python3\\python36.zip', 'E:\\software\\python3\\DLLs', 'E:\\software\\python3\\lib', 'E:\\software\\python3', 'E:\\software\\python3\\lib\\site-packages']
- >>> ays.maxunicode
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- NameError: name 'ays' is not defined
- >>> sys.maxunicode
- 1114111
- >>> sys.maxsize
- 2147483647
- >>> sys.modules
- {'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_thread': <module '_thread' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_io': <module 'io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'winreg': <module 'winreg' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from 'E:\\software\\python3\\lib\\encodings\\__init__.py'>, 'codecs': <module 'codecs' from 'E:\\software\\python3\\lib\\codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from 'E:\\software\\python3\\lib\\encodings\\aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'E:\\software\\python3\\lib\\encodings\\utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' (built-in)>, 'encodings.latin_1': <module 'encodings.latin_1' from 'E:\\software\\python3\\lib\\encodings\\latin_1.py'>, 'io': <module 'io' from 'E:\\software\\python3\\lib\\io.py'>, 'abc': <module 'abc' from 'E:\\software\\python3\\lib\\abc.py'>, '_weakrefset': <module '_weakrefset' from 'E:\\software\\python3\\lib\\_weakrefset.py'>, 'site': <module 'site' from 'E:\\software\\python3\\lib\\site.py'>, 'os': <module 'os' from 'E:\\software\\python3\\lib\\os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from 'E:\\software\\python3\\lib\\stat.py'>, '_stat': <module '_stat' (built-in)>, 'ntpath': <module 'ntpath' from 'E:\\software\\python3\\lib\\ntpath.py'>, 'genericpath': <module 'genericpath' from 'E:\\software\\python3\\lib\\genericpath.py'>, 'os.path': <module 'ntpath' from 'E:\\software\\python3\\lib\\ntpath.py'>, '_collections_abc': <module '_collections_abc' from 'E:\\software\\python3\\lib\\_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'E:\\software\\python3\\lib\\_sitebuiltins.py'>, 'sysconfig': <module 'sysconfig' from 'E:\\software\\python3\\lib\\sysconfig.py'>, 'atexit': <module 'atexit' (built-in)>}
- >>> sys.exit()
sys模块常见的使用方法
argv的应用:

- import sys
- # 源文件为python解释器第二个参数
- src_file = sys.argv[1]
- # 目的文件问传入的第三个参数
- dst_file = sys.argv[2]
- with open(src_file, 'rb') as read_f, open(dst_file, 'wb') as write_f:
- for line in read_f:
- write_f.write(line)
- # 在终端中 执行当前文件
- # C:\Users\Administrator>python H:\python_study\day20\内容回顾.py H:\python_study\day20\test2.py H:\python_study\day20\test22.py
copy文件时当做参数使用
sys的应用(进度条)

- import sys
- import time
- def progress(percent, width=50):
- # 当百分比大于1的时候都按照1来显示
- if percent >= 1:
- percent = 1
- # '[%%-%ds]' % width ====> %-50s
- # 然后通过格式化得到我们想要的值
- show_str = ('[%%-%ds]' % width) % ('#' * int((width * percent)))
- # 最后打印的时候加上百分比
- print('{show_str} {percent}%'.format(
- show_str=show_str,
- percent=int(percent * 100)
- ))
- # 模拟下载数据数据大小为1024567
- data_size = 1024567
- recv_size = 0
- while recv_size < data_size:
- # 模拟数据延迟0.1秒
- time.sleep(0.1)
- # 每次下载1024
- recv_size += 1024
- # 得到百分比打印
- percent = recv_size / data_size
- progress(percent)
模拟下载数据显示打印条
模块四:random
- import random
- random.random() # 得到一个(0-1)之间的浮点数
- random.uniform(1, 3) # 得到一个(1, 3)之间的一个小数
- random.randint(1, 3) # 得到一个[1, 3]之间的整数
- random.randrange(1, 3) # 得到一个[1, 3)之间的一个整数
- random.choice([1, '23', [4, 5]]) # 获得列表中的一个值
- random.choices([1, '23', [4, 5]], k=2) # 获得列表中的两个值返回一个列表
- random.sample([1, '23', [4, 5]], k=2) # 列表元素任意2个组合
-
- # 打乱顺序
- l = [1,2,3,4,5]
- random.shuffle(l) # 传递的必须是一个列表
- print(l)
生成一个随机验证码:

- # 验证码包含数字和字母
- def get_auth_code(num):
- temp_list = []
- while num:
- num -= 1
- # 首先获得数字
- a = str(random.randint(0, 10))
- # 其次获得字符
- b = chr(random.randint(0, 120))
- # 添加到列表中
- temp_list.append(random.choice([a, b]))
- return temp_list
- print(' '.join(get_auth_code(4)))
随机验证码的生成
模块五: shutil
- '''
- shutil 高级的文件,文件夹,压缩包处理模块
- 文件处理:
- shutil.copyfileobj 传入的是两个对象,源文件,目的文件
- shutil.copyfile 传入的是两个路径,原路径,目的路径
- shutil.copymode 只复制文件的权限,目的恩瑾可定是要存在
- shutil.copystat 只复制文件的状态信息,修改时间,查看时间,更改时间,flag是
- shutil.copy 拷贝文件和权限
- shutil.copy2 拷贝文件和状态信息
- shutil.move() 更改文件名称
- 文件夹处理
- shutil.copytree 拷贝目录
- shutil.ignore_patterns 根据这个模块去设置是否不拷贝某个类型的文件
- shutil.rmtree 删除目录
- 压缩包处理
- shutil.make_archive() 压缩后的目录名称,格式,源目录
- shutile.unpack_archive() 压缩后的目录名称, 格式,解压后的目录
-
- tarfile.open().add()
- zipfile.ZipFile().write()
- '''
文件的操作:
方法1: copyfileobj:
- # 方法copyfileobj
- # 我们要首先得到两个打开的文件对象
- # src就是源文件对象
- # dst目标文件对象
- src = open('sys模块.py', 'rb')
- dst = open('sys模块2.py', 'wb')
- shutil.copyfileobj(src, dst)
- src.close()
- dst.close()
方法2: copyfile
- # 和方法1类似,只不过它传递的是路径,而方法1传递的是对象
# 拷贝一个文件,而不是一个对象,目标文件可以不存在 - shutil.copyfile('sys模块.py', 'sys模块3.py')
方法3:copymode
- # 拷贝源文件的权限,在linux下面就是xrw之类的
- # 但是它的内容,用户,组都是不变的
- shutil.copymode('sys模块.py', 'sys模块2.py') # 目标文件必须要存在
方法4: copystat
- # 拷贝源文件的状态信息
- # 包括权限,查看时间,修改时间,flags等
- shutil.copystat('sys模块.py', 'sys模块2.py')
方法5: copy2和copy
- # 拷贝的是文件的内容和权限
- shutil.copy('sys模块.py', 'sys模块4.py')
- # 拷贝的是文件的内容和状态
- shutil.copy2('sys模块.py', 'sys模块5.py')
文件夹操作:
方法1:copytree
- # 拷贝一个目录,目标目录不能存在,而且还要对其父目录可以有写权限
- # symlinks 代表的是软连接,就相当于是一个快捷方式
- # shutil.ignore_patterns拷贝的时候把符合模式的给删除掉就是了
- shutil.ignore_patterns()
- shutil.copytree(r'..\day20', 'forlder3',
- ignore=shutil.ignore_patterns('*pyc','tmp*'),
- symlinks=True
- )
方法2:rmtree
- # 递归的删除一个文件夹
- shutil.rmtree('forlder2')
方法3:move
- # 就像是linux下面的重命名mv命令
- # 参数一为源文件名,参数二为目标文件名
- shutil.move('forlder3', 'forlder2')
压缩文件夹
方法1: make_archive
- # 参数一:压缩之后的名字
- # 参数二: 以什么样的格式压缩,可以是zip,tar,bztar, gztar
- # 参数三: 要压缩的目录
- '''
- owner: 用户,默认当前用户
- group: 组,默认当前组
- logger: 用于记录日志,通常是logging.Logger对象
- '''
- shutil.make_archive('forlder2', 'zip', root_dir='../day20')
解压文件
方法1:unpack_archive
- # 先打包一份zip的文件
- shutil.make_archive('day19', 'zip', root_dir='..\day19')
- # 解压文件,要加上后缀名称
- # 参数一: 解压的文件
- # format: 解压的格式
- # extract_dir: 解压的目录
- shutil.unpack_archive('day19.zip', format='zip',extract_dir='hello')
方法2:tarfile模块
- import tarfile
- # 压缩
- t = tarfile.open('day.tar', mode='w')
- t.add('sys模块.py')
- t.add('sys模块2.py')
- t.add('sys模块3.py')
- t.close()
- # 解压
- t = tarfile.open('day.tar', mode='r')
- t.extractall('./day')
- t.close()
方法3: zipfile模块
- import zipfile
- # 压缩
- # 首先得到一个zipfile的对象,然后通过write压缩进对象中
- z = zipfile.ZipFile('day.zip', mode='w')
- z.write('sys模块.py')
- z.write('sys模块2.py')
- z.write('sys模块3.py')
- z.close()
- # 解压
- # 也是先得到对象,然后通过extractall获得对象
- z = zipfile.ZipFile('day.zip', mode='r')
- z.extractall(path='./day')
- z.close()
模块六:os模块
- '''
- os模块: 指的是和操作系统相关的模块
- 1. 目录操作
- 增
- os.mkdir 创建一个单级目录
- os.makedirs 创建多级目录,递归创建
- 删
- os.rmdir 删除一个目录
- os.removedirs 递归删除目录,如果目录为空
- 改
- chdir 改变当前目录
- pardir 当前执行目录的父目录
- curdir 当前执行文件的目录
- 查
- getcwd() 获得当前解释器执行文件目录
- listdir() 以列表的形式返回当前目录下面有什么内容
- 2. 文件操作
- 删
- os.remove() 删除文件
- 改
- os.rename() 修改文件名称
- 查
- os.stat 查看当前文件的状态信息
- os.path.getsize() 查看当前文件的大小
- os.path.getatime() 查看当前文件的创建时间
- os.path.getmtime() 查看当前文件的修改时间
- 3. 变量信息
- os.stat # 文件的状态信息
- os.name # win是‘nt’, linux平台是'posix'
- os.sep # 操作系统特定的路径分隔符
- os.linesep # 换行符win为'\t\n', linux为'\t'
- os.pathsep # 分割文件路径的字符串win为;, linux为:
- os.environ # 系统环境变量
- os.system() # 运行shell命令,直接显示
- 4. 路径的判断
- os.path.exists() # 判断路径是否存在
- os.path.isfile() # 判断是否是个文件
- os.path.isdir() # 判断是否是个目录
- os.path.join() # 拼接路径
- 5. 路径操作
- os.path.split() # 以列表的形式返回文件名和目录
- os.path.basename # 获得得就是split的文件名
- os.path.dirname # 获得得就是split的目录
- 5. 规范化路径
- os.path.normcase() # 将大写变小写,并将所有斜杠转成反斜杠(返回的是原字符串)
- os.path.normpath() # 会把反斜杠转换成斜杠,然后可以识别相对路径
- os.path.abspath() # 返回path规范化的绝对路径
- '''
- # 一般路径的处理使用这种方式
- import os, sys
- TOP_DIR = os.path.normpath(os.path.join(
- os.path.abspath(__file__),
- os.pardir,
- ))
- print(TOP_DIR)
- # 不建议使用下面这种方式
- TOP_DIR = os.path.dirname(os.path.dirname(__file__))
- 在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
- >>> os.path.normcase('c:/windows\\system32\\')
- 'c:\\windows\\system32\\'
-
- 规范化路径,如..和/
- >>> os.path.normpath('c://windows\\System32\\../Temp/')
- 'c:\\windows\\Temp'
-
- >>> a='/Users/jieli/test1/\\\a1/\\\\aa.py/../..'
- >>> print(os.path.normpath(a))
- /Users/jieli/test1