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'])  # <module 'my' from './test\\my.py'>
print(type(sys.modules['my']))  # <class 'module'>

# 打印操作系统标识
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))  # <class 'collections.deque'>
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))  # <class 'time.struct_time'>
# 第一个参数是个元组
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)))  # <class 'datetime.timedelta'>

# 计算时间的差
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))  # <class 'str'>, 额,真的只是个日历,字符串
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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容