Python基础(下)
这次总结了Python基础的最后半部分,有些内容总结的不是很到位,后续发现问题也会再改正。
16. 字符串
16.1 字符串的驻留机制
- 字符串
- 在Python中字符串是基本数据类型,是一个不可变的字符序列
- 什么叫字符串驻留机制呢?
- 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时候,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
1 |
|
由此可见,无论是
a
还是b
还是c
,他们指向的空间都是同一块地址
- 驻留机制的几种情况(交互模式)
- 字符串的长度为0或者1时
- 符合标识符的字符串
- 字符串直在编译时进行驻留,而非运行时
- [-5, 256]之间的整数数字
1 |
|
sys
中的intern()
方法强制两个字符串指向同一个对象PyCharm
对字符串进行了优化处理
字符串驻留机制的优缺点
- 当需要值相同的字符串时,可以直接从字符串池里拿出来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的
- 在需要进行支付穿拼接的时候建议使用
str
类型的join
方法,而非+
,因为join()
方法是闲计算出所有字符串中的长度,然后再拷贝,只new
一次对象,效率比“+
”效率高
16.2 字符串的常用操作
1. 字符串的查询操作的方法
方法名称 | 作用 |
---|---|
index() |
查找子串substr 第一次出现的位置,如果查找的子串不存在时,则抛出ValueError |
rindex() |
查找子串substr 最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError |
find() |
查找子串substr 第一次出现的位置,如果查找的子串不存在时,则返回-1 |
rfind() |
查找子串substr 最后一次出现的位置,如果查找的子串不存在时,则返回-1 |
1 |
|
由上述代码空可见,
index
和find
都能查找子串出现的位置,但是index
会抛出异常,所以一般建议使用find
方法
2. 字符串的大小写转换操作的方法
方法名称 | 作用 |
---|---|
upper() |
把字符串中所有字符都转换成大写字母 |
lower() |
把字符串中所有字符都转换成小写字母 |
swapcse() |
把字符串中所有大写字母转换成小写字母,把所有小写字母转换成大写字母 |
capitalize() |
把第一个字符转换成大写,把其余字符转换成小写 |
title() |
把每一个单词的第一个字符转换成大写,把每个单词剩余字符转换成小写 |
1 |
|
3. 字符串内容对齐操作的方法
方法名称 | 作用 |
---|---|
center() |
居中对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数的可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串 |
ljust() |
左对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数的可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串 |
rjust() |
右对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数的可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串 |
zfill() |
右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身 |
1 |
|
4. 字符串劈分操作的方法
方法名称 | 作用 |
---|---|
split() |
1. 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 2. 以通过参数sep指定劈分字符串是的劈分符 3. 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独作为一部分 |
rsplit() |
1. 从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 2. 以通过参数sep指定劈分字符串是的劈分符 3. 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独作为一部分 |
1 |
|
如果字符串劈分没有设定
maxsplit
,其实split
和rsplit
的效果是一样的
5. 判断字符串操作的方法
方法名称 | 作用 |
---|---|
isidentifier() |
判断指定的字符串是不是合法的标识符(字母、数字、下划线) |
isspace() |
判断指定的字符串是否全部由空白字符组成(回车、换行,水平制表符) |
isalpha() |
判断指定的字符串是否全部由字母组成 |
isdecimal() |
判断指定的字符串是否全部由十进制的数字组成 |
isnumeric() |
判断指定的字符串是否全部由数字组成 |
isalnum() |
判断指定的字符串是否全部由字母和数字组成 |
1 |
|
在上面的代码例子中,有几个比较特殊的地方,一个是罗马数字和汉语数字一二三并不是十进制数字,但是在判断是否由数字组成的时候,他们的返回值是
True
,就说明,他们虽然不是十进制数字,但是也是数字,系统判断为True
6. 字符串操作的其它方法
功能 | 方法名称 | 作用 |
---|---|---|
字符串替换 | replace() |
第1个参数指定被替换的子串,第2个参数指定替换子串的字符串,该方法返回替换得到的字符串,替换前的字符串不会发生改变,调用该方法时可以通过第3个参数指定最大替换次数 |
字符串合并 | join() |
将列表或者元组中的字符串合并为一个字符串 |
1 |
|
16.3 字符串的比较
字符串的比较操作
- 运算符:>、>=、<、<=、==、!=
- 比较规则:首先比较两个字符串的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
- 比较原理:两个字符进行比较时,比较的是其
ordinal value
(原始值),调用内置函数ord
可以得到指定字符的ordinal value
。与内置函数ord
对应的是内置函数chr
,调用内置函数chr时指定ordinal value
可以得到其对应的字符
1 |
|
16.4 字符串的切片操作
字符串是不可变类型
- 不具备增、删、改等操作
- 切片操作将产生新的对象
1 |
|
16.5 格式化字符串
1 |
|
上面代码是常见的三种格式化字符串的表示方式,第一中是利用
%
占位符,其中%s
代表字符串,%i
和%d
代表整数,%f
代表浮点数。第三中方法的使用,需要在输出语句的前面加上一个f
,来格式化字符串
1 |
|
上面代码是来格式化数字的一些宽度和精度的,一共展示了两种比较常见的方法
16.6 字符串的编码与转码
为什么需要字符串的编码转换
A计算机(str
在内存种以Unicode
表示)——编码——> ——byte字节传输——> ——解码——> B计算机(显示)
编码与解码的方式
- 编码:将字符串转换成二进制数据(
bytes
) - 解码:将
bytes
类型的数据转换成字符串类型
1 |
|
上面的代码,就是字符串的编码和解码的操作,
encode
为编码,decode
为解码,需要注意的是编码和解码的格式必须一一对应
17. 函数
17.1 函数的创建和调用
什么是函数
- 函数就是执行特定任何以完成特定功能的一段代码
为什么需要函数
- 复用代码
- 隐藏实现细节
- 提高可维护性
- 提高可读性便于调试
函数的创建
1 |
|
- 函数的创建
1 |
|
- 函数的调用
1 |
|
- 跳到定义函数的函数体内
- 执行函数体
- 跳到函数的调用处
- 继续执行下一条语句
17.2 函数的参数传递
- 位置实参
- 根据形参对应的位置进行实参传递
- 关键字实参
- 根据形参名称进行实参传递
1 |
|
函数调用的参数传递内存分析
1 |
|
17.3 函数的返回值
- 函数返回多个值时,结果为元组
1 |
|
函数在定义时,是否需要返回值,视情况而定,如果需要返回值,就写上返回值,需要注意的就是,返回多个值的时候,返回的类型为元组
17.4 函数的参数定义
- 函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参
1 |
|
上面代码,说明了如果对形参设定了默认值,而传递参数的时候,只有和默认值不符合的时候才会传递这个实参,例如传递
100
的时候,不影响b
的默认值,则不对b
进行传参,仍为10
。
- 个位可变的位置参数
- 定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
- 使用
*
定义个人可变的位置形参 - 结果为一个元组
1 |
|
- 个数可变的关键字形参
- 定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
- 使用
**
定义个数可变的关键字形参 - 结果为一个字典
1 |
|
1 |
|
上面代码是函数定义的参数定义的一个特殊情况,如果又有关键字形参也有位置形参,那就要求个数可变的位置形参,放在个数可变的关键字形参的前面
序号 | 参数的类型 | 函数的定义 | 函数的调用 | 备注 |
---|---|---|---|---|
1.1 | 位置实参 | √ | ||
1.2 | 将序列中的每个元素都转换成位置实参 | √ | 使用* |
|
2.1 | 关键字实参 | √ | ||
2.2 | 将序列中的每个键值对都转换为关键字实参 | √ | 使用** |
|
3 | 默认值形参 | √ | ||
4 | 关键字形参 | √ | 使用* |
|
5 | 个数可变的位置形参 | √ | 使用* |
|
6 | 个数可变的关键字形参 | √ | 使用** |
函数调用的时候的参数传递
1 |
|
函数调用的时候,函数的定义形参问题
1 |
|
17.5 变量的作用域
- 程序代码能访问该变量的区域
- 根据变量的有效范围可以分为
- 局部变量
- 在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就成为全局变量
- 全局变量
- 函数体外声明的变量,可作用于函数内外
- 局部变量
1 |
|
17.6 递归函数
什么是递归函数
- 如果在一个函数的函数体内调用了该函数本身,这个函数就称为递归函数
递归的组成部分
- 递归调用与递归终止条件
递归的调用过程
- 每递归调用一次函数,都会在栈内存分配一个栈帧
- 每执行完一次函数,都会释放相应的空间
递归的优缺点
- 缺点:占用内存多,效率底下
- 优点:思路和代码简单
使用递归来计算阶乘
1 |
|
使用递归来计算斐波那契数列
1 |
|
18. Bug
18.1 Bug的由来及分类
马克2号当年计算机出现问题,始终没有修理好,最终打开计算机,发现里面有一只飞蛾,便有了Bug
- 世界上第一部万用计算机的进化版-马克2号(Mark Ⅱ)
bug的常见类型
- 粗心导致的语法错误
SyntaxError
- 知识点不熟练导致的错误
- (1) 索引越界问题IndexError
lst = [11,22,33,44]
print(lst[4])
应该输出lst[3]
- (2) append()方法的使用掌握不熟练
lst = []
lst = append('a','b','c','d')
append是列表的方法,在调用的时候应该是lst.append('A')
print(lst)
并且append
方法一次只能添加一个元素
18.2 不同异常类型的处理方式
粗心导致错误的自查宝典
- 漏了末尾的冒号,如if语句、循环语句、else子句等
- 缩进错误,该缩进的没缩进,不该缩进的瞎缩进
- 把英文符号写出中文符号,比如说:冒号、引号、括号
- 字符串拼接的时候,把字符串和数字拼接在一起
- 没有定义变量,比如说while的循环条件的变量
- “
==
”比较运算符和“=
”赋值运算符的混用
思路不清晰导致的问题解决方案
- 使用
print()
函数 - 使用“
#
”暂时注解部分代码
- 使用
被动掉坑:程序代码逻辑没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃
- 被动掉坑问题的解决方案
- Python提供了异常处理机制,可以在异常出现的时候及时捕获,然后内部“消化”,让程序继续运行
- 多个except结构
- 捕获异常的顺序按照先子类后父类的顺序,为了避免遗漏可能出现的异常,可以在最后增加BaseException
- 被动掉坑问题的解决方案
1 |
|
1 |
|
上面的代码是只处理一个异常,所以只使用了一个
except
1 |
|
上面的代码,想要处理多个异常,所以加了很多个except分支,从而判断异常的类型
18.3 异常处理机制
try...except...else
结构- 如果
try
块中没有抛出异常,则执行else
块,如果try
中抛出异常,则执行except
块
- 如果
1 |
|
try...except...else...finally
结构finally
块无论是否发生异常都会被执行,能常用来释放try
块中申请的资源
1 |
|
- Python常见的异常错误
序号 | 异常类型 | 描述 |
---|---|---|
1 | ZeroDivisionError |
除(或取模)零(所有数据类型) |
2 | IndexError |
序列中没有此索引(index ) |
3 | KeyError |
映射中没有这个键 |
4 | NameError |
未声明/初始化对象(没有属性) |
5 | SyntaxError |
python语法错误 |
6 | ValueError |
传入无效的参数 |
traceback
模块- 使用traceback模块打印异常信息
1 |
|
18.4 PyCharm的调试模式
- 断点
- 程序运行到此处,暂时挂起,停止执行,此时可以详细观察程序的运行情况,方便做出进一步判断
- 进入调试试图
- 进入调试试图的三种方式
- 单机工具栏上的按钮
- 右键单击编辑区:点击:
debug‘模块名’
- 快捷键:
shift+F9
- 进入调试试图的三种方式
19. 编程的两大思想
19.1 两大编程思想
- 面向过程:事物比较简单,可以用线性的思维去解决
- 面向对象:事物比较复杂,使用简单的线性思维无法解决
- 共同点:面向对象和面向过程都是解决实际问题的一种思维方式
二者相辅相成,并不是对立的
解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系,方便我们分析整个系统,具体到围观操作,仍然使用面向过程方式来处理
19.2 类和对象的创建
- 类
- 类别:分门别类,物以类聚,人类、鸟类、动物类、植物类
- 类是多个类似事物组成的群体的统称。能够帮助我们快速理解和判断事物的性质
- 数据类型
- 不同的数据类型属于不同的类
- 使用内置函数
type()
查看数据类型
- 对象
- 100、99都是
int
类之下包含的相似的不同个例,这个个例专业术语称为实例或者对象 - 一切皆对象、万物皆对象
- 100、99都是
- 创建类的语法
1 |
|
- 类的组成
- 类属性
- 实例方法
- 静态方法
- 类方法
1 |
|
- 对象的创建
- 对象的创建又称为类的实例化
- 语法:
实例名 = 类名()
- 意义:有了实例,就可以调用类中的内容
19.3 类对象与类属性
1 |
|
在调用方法的时候,有一些不一样的方式,第一种就是
对象名.方法名
,如stu1.eat()
,第二种是类名.方法名(类的对象)
,如student.eat(stu1)
,这里的类的对象,其实就是指在声明中的self
19.4 类方法与静态方法
- 类属性:类中方法外的变量称为类属性,被该类的所有对象所共享
- 类方法:使用
@classmethod
修饰的方法,使用类名直接访问的方法 - 静态方法:使用
@staticmethod
修饰的主发,使用类名直接访问的方法
1 |
|
动态绑定属性和方法
- Python是动态语言,在创建对象之后,可以动态地绑定属性和方法
1 |
|
- 编程实现
- 面向对象
- 面向过程
- 类对象
class
- 类属性
- 类方法
- 实例方法
- 静态方法
- 实例对象
- 类名(),创建实例对象
- 动态绑定属性
- 动态绑定方法
20. 面向对象的三大特性
面向对象的三大特性
- 封装:提高程序的安全性
- 将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。这样,无需关心方法内部的具体实现细节,从而隔离了复杂类
- 在Python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,前边使用两个”_”
- 继承:提高代码的复用性
- 多态:提高程序的可扩展性和可维护性
20.1 封装
封装就是将一些属性或者方法封装在类内,使得类内可以访问,类外不能访问
1 |
|
20.2 继承
- 语法格式
1 |
|
- 如果一个类没有继承任何类,则默认继承object
- python支持多继承
- 定义子类时,必须在其构造函数中调用父类的构造函数
1 |
|
20.3 方法重写
- 如果子类对继承自父类的某个属性或方法不太满意,可以从子类中对其(方法体)进行重新编写
- 子类重写后的方法中可以通过
super().xxx()
调用父类中被重写的方法
1 |
|
20.4 object
类
boject
类是所有类的父亲,因此所有类都有object
类的属性和方法- 内置函数
dir()
可以查看指定对象所有属性 object
有一个__str__()
方法,用于返回一个对于“对象的描述”,对应于内置函数str()
经常用于print()
方法,帮助我们查看对象的信息,所以我们经常会对__str__()
进行重写
1 |
|
我们经常会在定义一个类之后,重写他的
__str__()
方法,来对类进行一个描述
20.5 多态
- 简单的说,多态就是“具有多种形态”,它指的是:即便不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法
1 |
|
- 静态语言和动态语言关于多态的区别
- 静态语言实现多态的三个必要条件
- 继承
- 方法重写
- 父类引用指向子类对象
- 动态语言的多态崇尚“鸭子类型”,当看到一只鸟走起来像鸭子、游泳起来像鸭子、收起来也想鸭子,那么这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为
- 静态语言实现多态的三个必要条件
20.6 特殊方法和特殊属性
名称 | 描述 | |
---|---|---|
特殊属性 | __dict__ |
获得类对象或实例对象所绑定的所有属性和方法的字典 |
特殊方法 | __len__() |
通过重写方法,让内置函数len() 的参数可以自定义类型 |
特殊方法 | __add__() |
通过重写方法,可使用自定义对象具有“+ ”功能 |
特殊方法 | __new__() |
用于创建对象 |
特殊方法 | __init__() |
对创建的对象进行初始化 |
- 特殊属性
1 |
|
- 特殊方法
1 |
|
下面的代码主要是介绍__init__()
和__new__()
方法的意思
1 |
|
根据上面代码的输出结果,不难得出有一些结论,其实在创建实例对象的过程中,首先先创建了一个
Person('张三', 20)
,在类内,先是调用了new
方法,在方法中又调用 了父类object
的new
方法,之后调用了init
方法,最后才把实例化的Person
赋值给p1
20.7 类的深拷贝和浅拷贝
- 变量的赋值操作
- 只是形成两个变量,实际上还是指向同一个对象
1 |
|
- 浅拷贝
- Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
1 |
|
由代码打印出来的
id
可以得到,浅拷贝只会拷贝父对象,子对象没有进行拷贝,得到的子对象的id
都是相同的
- 深拷贝
- 使用
copy
模块的deepcopy
函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
- 使用
1 |
|
由打印出来的
id
可以发现,深拷贝中,不仅父对象被拷贝,父对象中的每个子对象也都被拷贝
21. 模块
21.1 什么叫模块
- 模块的英文单词为
Modules
- 函数与模块的关系
- 一个模块中可以包含N多个函数
- 在Python中一个扩展名为
.py
的文件就是一个模块 - 使用模块的好处
- 方便其它程序和脚本的导入与使用
- 避免函数名和变量名冲突
- 提高代码的可维护性
- 提高代码的可重用性
21.2 自定义模块
- 创建模块
- 新建一个
.py
文件,名称尽量不要与Python自带的标准模块名称相同
- 新建一个
- 导入模块
1 |
|
21.3 以主程序的形式执行
- 在每个模块的定义中都包括一个记录模块名称的变量
__name__
,程序可以检查该变量,以确定他们在哪个模块中执行。如果一个模块不是被导入到其它程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__
变量的值为__main__
1 |
|
1 |
|
21.4 Python中的包
包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下
作用:
- 代码规范
- 避免模块名称冲突
包和目录的区别
- 包括
__init__.py
文件的目录称为包 - 目录里通常不包含
__init__.py
文件
- 包括
包的导入
import 包名.模块名
导入带有包的模块时注意事项
import pageage1
import cakc
- 使用
import
方式导入时,只能跟包名或者模块名 from pageage1 import module_A
from pageage1.module_A import a
- 使用
from...import
可以导入包、模块、函数、变量
21.5 第三方模块的安装以及使用
- python中常用的内置模块
模块名 | 描述 |
---|---|
sys |
与Python解释器及其环境操作相关的标准库 |
time |
提供与时间相关的各类函数的标准库 |
os |
提供了访问操作系统服务功能的标准库 |
calendar |
提供与日期相关的各类函数的标准库 |
urllib |
用于读取来自网上(服务器)的数据标准库 |
json |
用于使用json序列化和反序列化对象 |
re |
用于在字符串中执行正则表达式匹配和替换 |
math |
提供标准算术运算函数的标准库 |
decimal |
用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算 |
logging |
提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能 |
- 第三方模块的安装
pip install 模块名
- 第三方模块的使用
import 模块名
22. 编码
22.1 编码格式介绍
- 常见的字符编码格式
- Python的解释器使用的是
Unicode
(内存) .py
文件在磁盘上使用UTF-8
存储(外存)
- Python的解释器使用的是
22.2 文件的读写原理
- 文件读写俗称“IO操作”
- 文件读写操作流程
- 操作原理
- Python操作文件
- 打开或新建文件
- 读、写文件
- 关闭资源
- 又从
.py
文件——>解释器——>OS——>操作——>硬盘
22.3 文件的读写操作
- 内置函数opem()创建文件对象
- 语法规则
file = open(filename [, mode, encoding])
1 |
|
- 常用的文件打开模式
- 按照文件中数据的组织形式,文件分为以下两大类
- 文本文件:存储的普通“字符”文本,默认为Unicode字符集,可以使用记事本程序打开
- 二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,如MP3音频文件,jpg图片等
- 按照文件中数据的组织形式,文件分为以下两大类
打开模式 | 描述 |
---|---|
r |
以只读模式打开文件,文件的指针将会放在文件的开头 |
w |
以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件的指针在文件的开头 |
a |
以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾 |
b |
以二进制方式打开文件,不能单独使用,需要与其它模式一起使用,rb 或者wb |
+ |
以读写方式打开文件,不能单独使用,需要与其它模式一起使用,如 a+ |
22.4 文件对象常用的方法
方法名 | 说明 |
---|---|
read([size]) |
从文件中读取size 个字节或字符的内容返回。若省略[size] ,则读取到文件末尾,即一次读取文件所有内容 |
readline() |
从文本文件中读取一行内容 |
readlines() |
把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) |
将字符串str 内容写入文件 |
writelines(s_list) |
将字符串列表s_list 写入文本文件,不添加换行符 |
seek(offset[, whence]) |
把文件指针移动到新的位置,offset 表示相对于whence 的位置:offset :为正往结束方向移动,为负往开始方向移动whence 不同的值代表不同含义:0:从文件开头开始计算(默认值) 1:从当前位置开始计算 2:从文件尾开始计算 |
tell() |
返回文件指针的当前位置 |
flush() |
把缓冲区的内容写入文件,但不关闭文件 |
close() |
把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
22.5 with语句(上下文管理器)
- with语句可以自动管理上下文资源,无论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的
1 |
|
1 |
|
22.6 目录操作
- OS模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样
- OS模块与
os.path
模块用于对目录或者文件进行操作
1 |
|
- os模块操作目录相关函数
函数 | 说明 |
---|---|
getcwd() |
返回当前的工作目录 |
listdir(path) |
返回指定路径下的文件和目录信息 |
mkdir(path[, mode]) |
创建目录 |
makedirs(path1/path2...[, mode]) |
创建多级目录 |
rmdir(path) |
删除目录 |
removedirs(path1/path2...) |
删除多级目录 |
chdir(path) |
将path设置为当前工作目录 |
os.path
模块操作目录相关函数
函数 | 说明 |
---|---|
abspath(path) |
用于获取文件或目录的绝对路径 |
exists(path) |
用于判断文件或目录是否存在,如果存在返回True ,否则返回False |
join(path, name) |
将目录与目录或者文件拼接起来 |
splitext() |
分离文件名和扩展名 |
basename(path) |
从一个目录中提取文件名 |
dirname(path) |
从一个路径中获取文件路径,不包括文件名 |
isdir(path) |
用于判断是否为路径 |
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!