12. python常用模块

基于网络课程《Python全栈开发专题》 记录笔记,请支持正版课程

sys模块

import sys

# 类似于java classpath
print(sys.path)

# 引入这个模块
sys.path.append(r'./test')
import my
my.greet('二狗')

# 引入my.py模块的另一种方法
# import imp
# my = imp.load_source('my', r'./test/my.py')
# my.greet('二狗')

print(sys.modules['my'])  # 
print(type(sys.modules['my']))  # 

# 打印操作系统标识
print(sys.platform)

# 获取运行参数,其中第1个参数是脚本本身
print(sys.argv[0])   # .... src\chapter12\demo01.py

# 标准输入输出流
s = sys.stdin.read(6)  # 只读取前6个字符
print(s)
sys.stdout.writelines('Hello Ketty')
sys.stderr.writelines('[Error] Something was happened.');

获取和改变工作目录

import os
# 获取和改变工作目录

print('当前工作目录:', os.getcwd())

# 目录下的所有文件和子目录
for dir in os.listdir(os.getcwd()):
    print(dir)

# 跳转
os.chdir('../')
print('改变后的工作目录:', os.getcwd())

print(os.cpu_count())
print(os.times())

文件与目录操作

import os

# exists & mkdir
if not os.path.exists('newDir'):
    os.mkdir('newDir')
#     pass

# makgedirs
# 第三个参数:exist_ok = True,文件夹存在不会报错;如果是False且存在,会报错  
os.makedirs('a/b/c', 0o733, exist_ok = True);

# rmdir
# 如果文件不存在会报错
try:
    os.rmdir('newDir')
except OSError as e:
    print(e)

# 删除多级目录
# 如果一级目录下不为空,则不为空的目录不会删除
os.removedirs('a/b/c')

# rename
if not os.path.exists('mydir') and os.path.exists('yourdir'):
    os.mkdir('mydir')
    os.rename('mydir', 'yourdir')

# renames
if os.path.exists('a/b/c'):
    os.renames('a/b/c', 'x/y/z')
    
# remove删除指定的文件
if os.path.exists('newdir/test.txt'):
    os.remove('newdir/test.txt')
# 如果用remove来删除文件夹,会报“拒绝访问”
os.remove('mydir')

软连接和硬连接

'''
Linux/Unix/MaxOS X:
ln 硬连接,是物理文件的镜像
ln -s  软连接,相当于是个快捷方式
'''
import os
if os.path.exists('data.txt') and not os.path.exists('slink_data.txt'):
    os.symlink('data.txt', 'slink_data.txt')

if os.path.exists('data.txt') and not os.path.exists('link_data.txt'):
    os.link('data.txt', 'link_data.txt');

用于获取和设置系统信息的函数和变量

import os

print('文件系统路径分隔符:', os.sep)
# win ";"  linux ":"
print('环境变量之间的分隔符:', os.pathsep)
print('操作系统名:', os.name)

# os.environ 环境变量
for name, value in os.environ.items():
    print('{} = {}'.format(name, value))

# 获取指定的一个环境变量
print('PATH = ', os.environ['PATH'])
print('PATH = ', os.getenv('PATH'))

# 子进程
import subprocess
output = subprocess.getstatusoutput('node -v');
print(output)

# os.system
os.system('dir')  # windows 
os.system('java -version')

集合(Set)

def printSet(obj):
    set1 = set(obj)
    print(set1)
    
# 创建一个集合
printSet(range(10))
# 字符串
printSet('abcdefg')
# 重复的
printSet('HelloKitty')

a = set((1, 2, 3))
b = set([3, 5, 1, 5])

# 并集
print(a.union(b))
print(a | b)

# 交集
print(a.intersection(b))
print(a & b)

# 子集
c = set([2, 3])
print(c.issubset(a)) # True
print(a.issubset(c)) # False

# 超集
print(c.issuperset(a)) # False 
print(a.issuperset(c)) # True

# 判断集合是否相等
d = set([1, 3, 2])
print(a == d) # True

# 差集,三种写法
print(a.symmetric_difference(b))
print(a ^ b)
print((a - b) | (b - a))

# copy
x = a.copy()
y = a
print(y is a)  # True
print(x is a)  # False

# contains
print(1 in a)  # True
print(10 in a) # False

将集合作为集合的元素: frozenset

a = set([1, 2])
b = set([10, 20])

# frozenset: 集合变成只读了
a.add(4)
print(a)

a.add(frozenset(b))
print(a)
# for obj in a:
#     print(type(obj))
#     print(obj)

d = {'Bill': 19, 'Gates': 22}
d[frozenset(a)] = 10
print(d)

t = (1, 2, 3, 4)
b.add(t)
d[t] = 10
print(b)
print(d)

堆(heap)

参考:详解Python中heapq模块的用法

import heapq
from random import *

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
heap = []

# 向堆中添加元素 heappush
for n in data:
    value = choice(data)  # 来自random,从数组中任选一个
    heapq.heappush(heap, value)

print(heap)
# heappush(heap, 'aaa')  数据类型要一直,否则会报错
heapq.heappush(heap, 300)
heapq.heappush(heap, 301)
print(heap)

# 从堆中取出第一个元素 heappop
print(heapq.heappop(heap))
print(heap)


# 将数组转为heap,重新排列了
data1 = [5, 6, 8, 0, 3]
print(data1)   # [5, 6, 8, 0, 3]
heapq.heapify(data1)
print(data1)   # [0, 3, 8, 6, 5]
print(heapq.heappop(data1))  # 0

# 删除现有元素并将其替换为一个新值: heapreplace
print(data1)
print(heapq.heapreplace(data1, 123))
print(data1)

# nlargest
print(heapq.nlargest(1, data1))  # 返回“最大的”一个
print(heapq.nlargest(2, data1))  # 返回“最大的”两个

# nsmallest
print(heapq.nsmallest(1, data))  # 返回“最小的”一个

# merge,不去重,可排序
print(list(heapq.merge([5, 4, 6], [1], [98, 888])))
print(list(heapq.merge(['aaa', 'bbbbb'], 'c', ['HelloKitty'], 'c', key=len)))

双端队列

from collections import deque

# 将列表转为双端队列
q = deque(range(10))
print(type(q))  # 
print(q)        # deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(q))

# 添加到队尾
q.append(100)
q.append(101)
# 添加到队首
q.appendleft(-1)
print(q)

# 弹出队尾的值
print(q.pop())

# 弹出队首的值
for i in range(3):
    print(q.popleft())
    
print('pop: ', list(q))

# 向左、向右循环移动
q.rotate(-2)
print(list(q))
q.rotate(4)
print(list(q))

# 向双端队列追加一个双端队列
# 数据类型可以是不一致的
q1 = deque(['a', 'b'])
q.extend(q1)
print(list(q))
q.extendleft(q1)
print(list(q))

时间元组

import time

# 获取当前时间
localtime = time.localtime(time.time())
print(localtime) # localtime是一个对象
print(type(localtime))  # 
# 第一个参数是个元组
st = time.struct_time((1, 2, 3, 4, 5, 6, 7, 8, 9))
print(st)

print('年', ':', localtime.tm_year)
'''
tm_year:4位数字的年
tm_mon:月
tm_mday:日
tm_hour:小时
tm_min:分钟
tm_sec:秒
tm_wday:一周的第几日
tm_yday:一年的第几日
tm_isdst:夏令时  1:夏令时, 0:不是夏令时, -1:位置,默认值是-1
'''

# 获取一个刻度的时间
localtime = time.asctime()
print(localtime)  # Thu Aug 30 18:00:49 2018

格式化日期和时间

import time
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))

时间戳的增量

import time

time1 = time.time()
time2 = time1 + 60  # 加60秒
print(time1, time2)

time3 = time1 - 60*60
time3 = time.localtime(time3)
print(time3)
print(time.strftime('%Y-%m-%d %H:%M:%S', time3))

计算日期和时间的差

import datetime

# 计算日期的差
d1 = datetime.datetime(2019, 5, 5)
d2 = datetime.datetime(2028, 5, 5)
print((d2-d1).days)
print(type((d2 - d1)))  # 

# 计算时间的差
d1 = datetime.datetime(2017,4,12,10,10,10)
d2 = datetime.datetime(2018,12,25,10,10,40)
print(d2 - d1)
print((d2 - d1).seconds)

# timedelta 直接用
d1 = datetime.datetime.now()
d2 = d1 + datetime.timedelta(hours=10)
print(d2)
d2 = d1 + datetime.timedelta(hours=-10)
print(d2)

获取某年某月的日历

import calendar
import locale

cal = calendar.month(2018, 1)
print(type(cal))  # , 额,真的只是个日历,字符串
print(cal)

# locale.setlocale(locale.LC_ALL, "")
print(calendar.calendar(2018))

随机数

import random
'''
randint(m,n):用于产生m到n之间的随机整数,包括m和n。
random():用于产生0到1之间的随机浮点数,包括0,但不包括1。
uniform(m,n):用于产生m到n之间的随机浮点数,m和n可以是浮点数,包括m和n。
randrange(m,n,step):在一个递增的序列中随机选择一个整数。其中step是步长。
例如,randrange(1,6,2),该函数就会在列表[1,3,5]中随机选择一个整数。
choice(seq):从seq指定的序列中随机选择一个元素值。seq指定的列表元素可以是任意类型的值。
sample(seq,k):从seq指定的序列中随机选取k个元素,然后生成一个新的序列。
shuffle(seq):把seq指定的序列中元素的顺序打乱,该函数直接修改原有的序列。
'''
# 1 ~ 100 随机整数
print(random.randint(1, 100))
# 0 ~ 1 之间的随机数
print(random.random())
# 小于20的3的倍数
print(random.randrange(0, 20, 3))
# 1 ~ 100.5的随机浮点数
print(random.uniform(1, 100.5))
# 从列表里面随机选
intList = [1, 2, 3, 4, 5, 6]
print(random.choice(intList))
# 从列表里面随机选三个
newList = random.sample(intList, 3)
print(newList)
# 打乱顺序
random.shuffle(intList)
print(intList)

数学函数

import math

# 圆周率
print('圆周率:', math.pi)
print('自然常数:', math.e)

# abs
print(math.fabs(-1.2))
# 向上取整
print(math.ceil(1.3))
# 向下取整
print(math.floor(1.9))
# 平方
print(math.pow(2, 10))
# 开根号
print(math.sqrt(4))
# 三角函数
print(math.sin(math.pi/2))
print(math.cos(math.pi))
print(math.tan(math.pi/4))

练习1

'''
1.  编写一个Python程序,从一个列表中随机取3个元素值,
并按取值顺序将元素值组成3级目录,然后创建这个3级目录。
例如,有一个列表['a','b','c','d','e'],
现在取的值依次是'a'、'd'、'c',组成的3级目录是“a/d/c”,
然后使用相应的函数创建这个3级目录即可。
'''
import random
import os
dirList = ['a', 'b', 'c', 'd', 'e', 'f']
path = ''
for name in random.sample(dirList, 3):
    path += name + os.sep
os.makedirs(path, exist_ok=True)

练习2

'''
编写一个Python程序,从控制台输入两个日期,格式:2011-1-1,
然后计算这两个日期之间相差多少天,并输出计算结果。
如果输入的日期格式错误,会抛出异常,并输出这个异常。
'''
# import datetime
from datetime import *
import math
try:
    d1 = input('输入第一个日期(yyyy-mm-dd): ')
    d1 = datetime.strptime(d1, '%Y-%m-%d')
    d2 = input('输入第二个日期(yyyy-mm-dd): ')
    d2 = datetime.strptime(d2, '%Y-%m-%d')
    print('两个日期之前相差 {} 天'.format(int(math.fabs((d2-d1).days))))
except Exception as e:
    print('日期格式可能不对:', e)

你可能感兴趣的:(12. python常用模块)