Python中的常用模块(上)

简介: Python中的常用模块

1.sys模块(内置模块)


在sys模块中定义了一些函数和变量,用来设置和获取系统的信息。

20191114110728512.jpg

# Python中的常用模块:sys模块
import sys
sys.path.append('./test')  # 向sys.path列表添加my模块所在的路径,my.py的代码在后面
import my               # 导入my模块
my.greet('李宁')        # 调用my模块中定义的greet函数
print(sys.modules['my'])  #输出已经装载的my模块的信息(使用modules字典)
print(type(sys.modules['my']))   # 输出modules字典中存储my模块value的数据类型
print(sys.platform)     # 输出当前的操作系统平台标识符
# 命令行参数
print(sys.argv[0])    # 输出当前脚本文件的文件名(包括完整路径)
# 如果有命令行参数,则输出第1个命令行参数的值,sys.argv列表的长度至少为1,因为第1个列表元素永远是当前脚本文件的路径
if len(sys.argv) == 2:
    print(sys.argv[1])   # 输出第1个命令行参数的值
    my.greet(sys.argv[1])  # 再次强调my模块中的greet函数,并传入该命令行参数的值
# 从标准输入流中采集长度为6的字符串
# 从终端中输入6个字符
s = sys.stdin.read(6)
print(s)
# 向标准输出流中写入一个字符串
# 向终端 或者 控制台 输出
sys.stdout.writelines("hello world")
print()
# 向标准错误流中写入一个字符串
sys.stderr.writelines("error")
# 设置执行当前脚本文件的返回值,后面会使用invoke.py调用当前脚本,以便获取这个返回值
sys.exit(123)

2019111421425610.png

需要在test文件的路径下建立一个invoke.py文件

import  subprocess
# 执行demo01.py脚本文件,并得到该脚本的返回的结果
output = subprocess.getstatusoutput("python demo01.py Mike")
print(output)
print(output[0])

终端:

20191114220514396.png

getstatusoutput函数返回了一个元组,第一个元素值就是被调用脚本文件的返回值(本例是123),第二个元素值是被调用脚本的输出结果。由于demo01.py中需要从标准输入流采集字符串,所以该脚本文件被调用时也需要输入一个长度为6的字符串(本例是“ABCDEFG”),代码才会往下执行。


2.OS模块


2.1获取与改变工作目录


工作目录:当前的操作目录


如果操作一个文件或者子目录,不指定路径,默认操作工作目录里的子目录和文件。


getcwd函数用于获取当前的工作目录


chdir函数可以改变当前的工作目录

import os
print('当前工作目录:',os.getcwd())  # 获取当前的工作目录,并输出该目录
print(os.listdir(os.getcwd()))   # 输出path指定的文件夹包含的文件或文件夹名字的列表
os.chdir('../')                  # 改变当前工作目录
print('改变后的工作目录:',os.getcwd())

结果:略


2.2 文件与目录操作


在os模块中提供了一些操作目录和文件的函数。

'''
1. mkdir(dirname, permissions) :创建目录,diename表示目录名
在linux和Mac OS X 上可以设置目录:读 r    写 w     执行x
如果dirname存在,会抛出OSError
2. makedirs(dirname, permissions,exist_ok)  用于建立目录
(1) mkdir('a')   mkdir('a/b')      makedirs('a/b/c') 在a里面创建一个b,在b里面创建一个c
(2) exist_ok == False,如果目录存在,抛出OS Error
    exist_ok == True,如果目录存在,什么都不做,不会抛出异常
3. rmdir(dirname):删除目录
rmdir('a'),如果a目录不为空,会抛出OSError异常
4. removedirs(dirname):删除目录
可以指定多级目录
removedirs('a/b/c')
b(c,test.txt)  只删除c,b和a目录保留
5 remove(filename):删除filename指定的文件
6. rename(src,dst):将src参数指定的文件(目录)改名为dst参数指定的文件名(目录名)
7 renames(src,dst) 与rename函数的功能类似,只是src和dst可以使多级目录(最后一级可以是文件名)。
函数会将每一级的目录都改成对应的目录名。
a/b/c   x/y/z
'''
import os
if not os.path.exists('newdir1'):  # 判断当前目录下是否存在newdir1目录
    os.mkdir('newdir1')     # 如果不存在该目录,则创建一个newdir1目录
# 创建多级目录,并将目录的权限设为0o733(八进制),True表示即使目录存在,也不会抛出异常。
os.makedirs('x/y/z',0o733,True)
try:
    # 删除单个目录,如果目录非空,则抛出一个OSError异常
    os.rmdir('newdir1')    
except OSError as e:
    print(e)
# 删除多级目录
os.removedirs('x/y/z')
if not os.path.exists('mydir'):
    os.mkdir('mydir')
    os.rename('mydir','yourdir')   # 将mydir目录重命名为yourdir
if os.path.exists('w/y/z'):     # 如果存在w/y/z
    os.renames('w/y/z','a/b/c')   # 重命名多级目录w/y/z 为 a/b/c
if os.path.exists('newdir1/test.txt'):
    os.remove('newdir1/test.txt')   # 删除文件newdir1目录下test.txt文件


2.3 软链接与硬链接


软链接与硬链接是linux和Mac OS X的概念。软链接就像Windows中的快捷方式,只是保存了源文件或目录的引用,而且只有固定尺寸。硬链接只能针对文件建立,这是因为硬链接是将整个文件复制一份,相当于一个副本,所以在建立硬链接时会进行限制。软链接和硬链接都是同步的。也就是说,只要修改软链接文件或硬链接文件,源文件的内容就会变,反之亦然。


不管是linux和Mac OS X,建立软链接和硬链接的命令都是ln,在建立软链接时,需要加“-s”命令行参数。


例:假设有一个test.txt文件,现在要对该文件建立一个软链接文件slink.txt和一个硬链接文件link.txt,则test.txt文件的内容如下:

hello world    # 源文件test.txt占用的字节数是25
世界你好
建立软链接和硬链接的命令如下:
ln -s test.txt slink.txt  # 软链接文件slink.txt占用的字节数为8,而且即使test.txt文件的尺寸变大,slink.txt文件的尺寸仍然是8字节,说明了slink.txt文件仅仅保存了源文件test.txt的引用。
ln test.txt link.txt   # 硬链接文件link.txt同样占用了25个字节,说明link.txt是test.txt文件的副本。

终端命令中:


输入:“ls -al”命令查看文件详细信息。

# 软链接与硬链接
# 软链接(符号链接),相当于Windows的快捷方式
# 硬链接,是文件的副本
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')

注意:symlink函数在windows中使用时要拥有管理员权限,或用管理员权限打开命令行工具,然后才可以在命令行工具中执行symlink函数,否则会抛出“OSError:symbolic link privilege not held”异常。


2.4 OS模块中的常用函数


在OS模块中还提供了很多用于获取和设置系统信息的函数和变量。


# 在os模块
'''
1.sep变量:用于返回当前OS的路径分隔符,Windows:反斜杠(\),
Linux、Unix、Mac OS X:斜杠(/)
2. pathsep变量:返回环境变量中的路径之间的分隔符,Windows用分号(;)分隔多个路径。
Linux和Mac OS X是冒号(:)
3. name变量:返回当前OS的名称
4. environ变量:以字典的形式返回系统中所有环境变量的值
5. getenv函数:获取指定的环境变量的值,通过参数可以指定环境变量名。
6. putenv函数:设置指定环境变量的值,通过参数指定环境变量名和环境变量值。
7. system函数:执行命令,通过参数指定要执行的命令。
'''
import os
import subprocess
print('路径分隔符:',os.sep)
print('环境变量路径之间的分隔符:',os.pathsep)
print('操作系统名:',os.name)
print(os.environ)      # 输出当前系统中所有环境变量的值
# 获取指定的环境变量值
print('PATH=',os.environ['PATH'])    # 输出PATH环境变量的值
print('PATH=',os.getenv('PATH'))     # 使用getenv函数获取了PATH环境变量的值
print("-------------------")
# 在Python脚本文件中执行另外一个程序。
output = subprocess.getstatusoutput('today')  # 执行today文件
print(output)  # 输出执行结果,返回一个元组。
os.putenv('PATH',os.getenv('PATH') + os.pathsep + '.')   # 将today文件所在的目录(.)加到PATH环境变量中
output = subprocess.getstatusoutput('today')   # 执行today文件
print(output)   # 输出执行结果
os.system('today')
os.system('ls -al')   # 执行"ls -al"命令,列出当前所有文件和目录的详细信息。

尽管使用putenv函数可以修改环境变量,但这种修改只是临时的,并不会影响系统的环境变量,只是在当前Python进程中会使用这些修改后的环境变量。使用getenv函数或environ变量重新获取这些环境变量时获取的仍然是未修改之前的值。


3.集合、堆和双端队列(heap模块、deque类)


Python3的集合(set)、堆(heap)和双端队列(deque)的用法。

其中,集合不需要导入任何模块,set类型已经内建进Python语言;

堆和双端队列分别要导入heapq模块和collections模块。


3.1 集合


Python语言中的集合和数学中集合的概念非常相似。在数学中集合有如下三个特征。


无序性:集合中每个元素的值都是平等的,元素之间是无序的。


互异性:集合中任意两个元素都是不同的,即每个元素只能出现一次。


确定性:集合中每个元素都是确定的,对于一个值来说,要么属于该集合,要么不属于该集合。


所以,集合、列表和字典都不能作为集合的元素值,因为他们都是可变的。


在创建集合类set的实例时,需要为set类的构造方法提供一个列表或元组类型的值,用于建立集合的数据源。也就是说,set类可以将列表或元组转换为集合,在转换的过程中,会去除重复的值,并且列表和元组中元素的顺序可能被打乱,因为集合中的元素是无序的。

# 集合(Set)
'''
集合,必须满足下面的3个条件
1. 无序性:集合中每一个元素的值都是平等的,元素之间是无序的。
2. 互异性:集合中任意两个元素都是不同的,每个元素只能在集合中出现一次
3. 确定性:集合中每个元素都是确定的,对于一个值来说,要么属于该集合,要么
不属于该集合。所以集合、列表、字典都不能作为集合的元素值,因为他们都是可变的。
集合的操作
创建集合、合并集合、集合相交、集合的差等
'''
set1 = set(range(10))   # 创建有10个元素的集合
print(type(set1))    # 输出set1的类型,运行结果:<class 'set'>
# 将字符串中的每一个字符作为元素添加进集合,因为字符串可看作字符的列表
# 会去除重复的字符,而且顺序会打乱
set2 = set('helloabc')
print(set2)     # 运行结果:{'a', 'b', 'h', 'c', 'o', 'l', 'e'}
print(set1)     # 运行结果:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
# 利用 字符串列表 建立集合,会去除重复的字符串,字符串的顺序会被打乱
set3 = set(['Pill','John','Mike','John'])
print(set3)    # 运行结果:{'John', 'Mike', 'Pill'}
a = set((1,2,3))      # 利用元组创建一个集合
b = set([3,5,1,6])    # 利用列表创建一个集合
# 集合的合并
print(a.union(b))    # 运行结果:{1, 2, 3, 5, 6}
print(a | b)         # 按位 或 的方式,运行结果:{1, 2, 3, 5, 6}
# 求a和b的交集,在两个集合中共同拥有的
print(a.intersection(b))    # 运行结果:{1, 3}
print(a & b)                # 按位 与 运算符,运行结果:{1, 3}
c = set([2,3])
print(c.issubset(a))    # 判断c集合是否为a集合的子集,运行结果:True
print(a.issubset(c))    # 判断a集合是否为c集合的子集,运行结果:False
# 超集,c是a的子集,则a就是c的超集
print(c.issuperset(a))   # 判断c集合是否为a集合的超集,运行结果:False
print(a.issuperset(c))   # 判断a集合是否为c集合的超集,运行结果:True
# 判断集合是否相等
d = set([1,3,2])
print(a == d)    # 运行结果:True
# 计算集合的差  a - c
print(a.difference(b))  # 运行结果:{2}
print(a - b)      # 运行结果:{2}
# 计算集合之间的对称差
# 对称差:只在一个集合中出现的元素组成的新集合
print(a.symmetric_difference(b))   # 运行结果:{2, 5, 6}
print(a ^ b)                       # 运行结果:{2, 5, 6}
# 对称差相当于a-b 与 b-a 的并集
print((a - b) | (b - a))           # 运行结果:{2, 5, 6}
x = a.copy()   # 使用copy方法将a复制一份,并将该副本赋给变量x,x和a是两个完全不同的集合,但是里面的元素相同
y = a   # 引用,y和a都是指向了同一个集合
print(y is a)   # 判断y与a 是否相同,运行结果:True
print(x is a)   # 判断x与a 是否相同,运行结果:False
x.add(30)    # 向集合a中添加一个新的元素
y.add(100)
print(x)     # 运行结果:{1, 2, 3, 30}
print(y)     # 运行结果:{1, 2, 3, 100}
print(a)     # 运行结果:{1, 2, 3, 100}
print(1 in a)     # 运行结果:True
print(10 in a)    # 运行结果:False
# 将集合作为集合的元素
#frozenset函数将集合变成只读的==不可变类型,这样就可以作为集合的元素和字典的key
# 集合的元素和字典中的key都不允许是可变的值,如集合、列表和字典,
# 元组既可以做集合的元素,也可以做字典的key
a = set([1,2])
b = set([10,20])
a.add(4)
print(a)  # 运行结果:{1, 2, 4}
a.add(frozenset(b))  # 使用frozenset函数将b集合变成只读的集合,成功将其添加到集合a
print(a)     # 运行结果:{1, 2, 4, frozenset({10, 20})}
# 字典的key不能是可变的,不能将字典的集合作为key来使用
d = {'Bill':30,'John':34}
#d[a] = 10   # a是可变的,会报错
d[frozenset(a)] = 10
print(d)    # 运行结果 {'Bill': 30, 'John': 34, frozenset({1, 2, 4, frozenset({10, 20})}): 10}
t = (1,2,3,4)
b.add(t)
d[t] = 10
print(d)  # 运行结果 {'Bill': 30, 'John': 34, frozenset({1, 2, 4, frozenset({10, 20})}): 10, (1, 2, 3, 4): 10}
目录
相关文章
|
21天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
23天前
|
存储 缓存 算法
Python中collections模块的deque双端队列:深入解析与应用
在Python的`collections`模块中,`deque`(双端队列)是一个线程安全、快速添加和删除元素的双端队列数据类型。它支持从队列的两端添加和弹出元素,提供了比列表更高的效率,特别是在处理大型数据集时。本文将详细解析`deque`的原理、使用方法以及它在各种场景中的应用。
|
3天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
5天前
|
测试技术 Python
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
|
5天前
|
Serverless 开发者 Python
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
37 1
|
7天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
47 0
|
8天前
|
Python
python学习14-模块与包
python学习14-模块与包
|
10天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
15天前
|
索引 Python
「Python系列」Python operator模块、math模块
Python的`operator`模块提供了一系列内置的操作符函数,这些函数对应于Python语言中的内建操作符。使用`operator`模块可以使代码更加清晰和易读,同时也能提高性能,因为它通常比使用Python内建操作符更快。
27 0
|
19天前
|
数据采集 网络协议 API
python中其他网络相关的模块和库简介
【4月更文挑战第4天】Python网络编程有多个流行模块和库,如requests提供简洁的HTTP客户端API,支持多种HTTP方法和自动处理复杂功能;Scrapy是高效的网络爬虫框架,适用于数据挖掘和自动化测试;aiohttp基于asyncio的异步HTTP库,用于构建高性能Web应用;Twisted是事件驱动的网络引擎,支持多种协议和异步编程;Flask和Django分别是轻量级和全栈Web框架,方便构建不同规模的Web应用。这些工具使网络编程更简单和高效。