文章目录
一、异常
1.异常机制本质
- 异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需 要处理的文件不存在、数组下标越界等。
- 所谓异常处理,就是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。
- python 中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中 包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了 python中内建异常类的继承层次:
python 中一切都是对象,异常也采用对象的方式来处理。 - 处理过程:
(1). 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该 异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
(2). 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。
2. 异常解决的关键:定位
- 当发生异常时,解释器会报相关的错误信息,并会在控制台打印出相关错误信息。我们 只需按照从上到下的顺序即可追溯(Trackback)错误发生的过程,最终定位引起错误的那一 行代码。
3. try…一个 except 结构
- try…except 是最常见的异常处理结构。
- 结构如下:
try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块
- try 块包含着可能引发异常的代码,except 块则用来捕捉和处理发生的异常。执行的时 候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;执行的时候,如果 try块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理 完后,继续执行后续代码。
#简单测试0不能做除数异常:
try:
print('step1')
a=3/0
print('step2')
except BaseException as e:
print('step3')
print(e)
print('step4')
运行结果:
step1
step3
division by zero
step4
#循环输入数字,如果不是数字则处理异常;直到输入 88,则结束循环。
while True:
try:
x=int(input('请输入一个数字'))
print('您输入的数字是:',x)
if x==88:
print('退出程序')
break
except:
print('异常输入的不是数字')
运行结果:
请输入一个数字dd
异常输入的不是数字
请输入一个数字we
异常输入的不是数字
请输入一个数字23
您输入的数字是: 23
请输入一个数字88
您输入的数字是: 88
退出程序
4. try…多个 except 结构
- 上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议 尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代 码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException。
- 结构如下:
try:
被监控的、可能引发异常的语句块
except Exception1:
处理 Exception1 的语句块
except Exception2:
处理 Exception2 的语句块 …
except BaseException:
处理可能遗漏的异常的语句块
#多个 except 结构
try:
a=float(input('请输入一个数字'))
b=float(input('请输入一个数字'))
c=float(a)/float(b)
print(c)
except ZeroDivisionError:
print('异常:除数不能为0')
except TypeError:
print('异常,除数和被除数都应该为数值类型')
except NameError:
print('异常,变量不存在')
except BaseException as e:
print(e)
print(type(e))
运行结果:
请输入一个数字3
请输入一个数字0
异常:除数不能为0
5.try…except…else 结构
- try…except…else 结构增加了“else 块”。如果 try 块中没有抛出异常,则执行 else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。
#try...except...else 结构
try:
a = float(input('请输入一个数字'))
b = float(input('请输入一个数字'))
c = float(a) / float(b)
except BaseException as e:
print(e)
else: #执行了except就不执行else了
print('结果是:',c)
运行结果:
请输入一个数字4
请输入一个数字2
结果是: 2.0
请输入一个数字4
请输入一个数字0
float division by zero
6. try…except…else…finally 结构
- try…except…finally 结构中,finally 块无论是否发生异常都会被执行;通常用来释放 try 块中 申请的资源。
#try...except...else 结构
try:
a = float(input('请输入一个数字'))
b = float(input('请输入一个数字'))
c = float(a) / float(b)
except BaseException as e:
print(e)
else:
print('结果是:',c)
finally:
print('不管前面是expect还是else,我都执行')
运行结果:
请输入一个数字4
请输入一个数字0
float division by zero
不管前面是expect还是else,我都执行
7. return 语句和异常处理问题
- 由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构 中,而是放到方法最后。
def test01():
print('step1')
try:
x=3/0
#return 'a'
except:
print('step2')
print('异常:0不能做除数')
#return 'b'
finally:
print('step4')
#return 'd'
print('step5')
return 'e'
test01()
运行结果:
step1
step2
异常:0不能做除数
step4
step5
8. 常见异常的解决
- SyntaxError:语法错误
int a = 3
int a =3
^
SyntaxError: invalid syntax - NameError:尝试访问一个没有申明的变量
print(a)
print(a)
NameError: name ‘a’ is not defined - ZeroDivisionError:除数为 0 错误(零除错误)
a = 3/0
a = 3/0
ZeroDivisionError: division by zero - ValueError:数值错误
float(“gaoqi”)
float(“gaoqi”)
ValueError: could not convert string to float: ‘gaoqi’ - TypeError:类型错误
123+“abc”
123+“abc”
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ - AttributeError:访问对象的不存在的属性
a=100
a.sayhi()
a.sayhi()
AttributeError: ‘int’ object has no attribute ‘sayhi’ - IndexError:索引越界异常
a = [4,5,6]
a[10]
a[10]
IndexError: list index out of range - KeyError:字典的关键字不存在
a = {‘name’:“gaoqi”,‘age’:18}
a[‘salary’] a[‘salary’]
KeyError: ‘salary’
9.常见异常汇总
10. with上下文管理
- finally 块由于是否发生异常都会执行,通常我们放释放资源的代码。其实,我们可以通过with上下文管理,更方便的实现释放资源的操作。
- with 上下文管理的语法结构如下:
with context_expr [ as var]:
语句块 - with 上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。
#with 上下文管理文件操作
with open('文件路径') as f:
for line in f:
print(line)
11. trackback 模块
#使用 Traceback 模块打印异常信息
import traceback
try:
print('step1')
num=2/0
except:
traceback.print_exc()
运行结果:
step1
Traceback (most recent call last):
File "/Users/fujinyue/PycharmProjects/pythonProject1/new6.py", line 6, in <module>
num=2/0
ZeroDivisionError: division by zero
Process finished with exit code 0
# 使用 traceback 将异常信息写入日志文件
import traceback
try:
print('step1')
num=2/0
except:
with open('需要写入的文件','a') as f: #其中a为添加的意思
traceback.print_exc(file=f)
12. 自定义异常类
- 程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error、Exception 为后缀。 自定义异常由 raise 语句主动抛出。
#自定义异常类和raise语句
class AgeError(Exception): #继承Exception
def __init__(self,errorInfo):
Exception.__init__(self) #调一下父类
self.errorInfo=errorInfo
def __str__(self):
return str(self.errorInfo)+'错误,年龄要在1-150之间'
#########测试代码##########
if __name__=='__main__': #如果为True,则模块是作为独立文件运行,可以执行测试代码
age = int(input('输入一个年龄:'))
if age<1 or age>150:
raise AgeError(age)
else:
print('年龄正常:',age)
运行结果:
输入一个年龄:167
Traceback (most recent call last):
File "/Users/fujinyue/PycharmProjects/pythonProject1/new7.py", line 13, in <module>
raise AgeError(age)
__main__.AgeError: 167错误,年龄要在1-150之间
13. pycharm开发环境的调试
- 进行调试的核心是设置断点。程序执行到断点时,暂时挂起,停止执行。就像看视频按 下停止一样,我们可以详细的观看停止处的每一个细节。
(1).断点
- 程序运行到此处,暂时挂起,停止执行。我们可以详细在此时观察程序的运行情况,方便做出进一步的判断。
设置断点: - (1) 在行号后面单击即可增加断点
-
- (2) 在断点上再单击即可取消断点
(2).进入调试视图
- 我们通过如下三种方式都可以进入调试视图:
(1) 单击工具栏上的按钮
(2) 右键单击编辑区,点击:debug ‘模块名’
(3) 快捷键:shift+F9 进入调试视图后,布局如下:
- 左侧为“浏览帧”:调试器列出断点处,当前线程正在运行的方法,每个方法对应一个“栈帧”。最上面的是当前断点所处的方法。
- 变量值观察区: 调试器列出了断点处所在方法相关的变量值。我们可以通过它,查看变量的值的变化。 也可以通过’绿色加号’,增加要观察的变量。
(3).调试操作区
- 我们通过上图中的按钮进行调试操作,它们的含义如下:
二、文件操作(IO 技术)
1. 文本文件和二进制文件
(1).文本文件
文本文件存储的是普通“字符”文本,python 默认为 unicode 字符集(两个字节表示 一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像 word 软件 编辑的文档不是文本文件。
(2).二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件 解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。
2. 文件操作相关模块概述
名称 | 说明 |
---|---|
io模块 | 文件流的输入和输出操作 input output |
os模块 | 基本操作系统功能,包括文件操作 |
glob模块 | 查找符合规则的文件路径名 |
fnmatch模块 | 使用模式来匹配文件路径名 |
fileinput模块 | 处理多个输入文件 |
filecmp模块 | 用于文件的比较 |
csv模块 | 用于csv文件处理 |
pickle 和 cPickle | 用于序列化和反序列化 |
xml包 | 用于 XML 数据处理 |
bz2、gzip、zipfile、zlib、tarfile | 用于处理压缩和解压缩文件(分别应对不同的算法) |
3. 创建文件对象open()
open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt。
为了减少""的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt",“w”)
打开方式有如下几种:
模式 | 描述 |
---|---|
r | 读read模式 |
w | 写write模式。如果文件不存在则创建;如果文件存在,则重写新内容; |
a | 追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容 |
b | 二进制 binary 模式(可与其他模式组合使用) |
+ | 读、写模式(可与其他模式组合使用) |
文本文件对象和二进制文件对象的创建:
如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字 符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
4.文本文件写入
(1).基本的文件写入操作
文本文件的写入一般就三个操作:
1.创建文件对象
2.写入数据
3.关闭文件对象
#文本写入操作简单测试
f=open(r'b.txt','a')
s='itbaizhi\naaaaaaa\n'
f.write(s)
f.close
(2).常用编码介绍
在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。为了让大家有能力解 决中文乱码问题,这里简单介绍一下各种编码之间的关系。
(3). 中文乱码问题
#测试写入中文
f=open(r'b.txt','w')
s='rr\ntt\nzz\n大哥大哥你好呀\n'
f.write(s)
f.close
文件内容:
rr
tt
zz
大哥大哥你好呀
(4).write()/writelines()写入数据
- write(a):把字符串 a 写入到文件中
- writelines(b):把字符串列表写入文件中,不添加换行符
#添加字符串列表数据到文件中
f=open(r'c.txt','w',encoding='utf-8')
s=["高淇\n","高老三\n","高老四\n"]
f.writelines(s)
f.close()
文件内容:
高淇
高老三
高老四
(5). close()关闭文件流
- 由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法 关闭文件对象。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush() 方法),再关闭文件,释放文件对象。
- 为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现 无论何种情况都能关闭打开的文件对象。
#结合异常机制 finally 确保关闭文件对象
try:
f=open(r'my01.txt','a')
str='zfloss'
f.write(str)
except BaseException as e:
print(e)
finally:
f.close()
运行结果:
zfloss
(6). with 语句(上下文管理器)
- with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能 确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
#使用 with 管理文件写入操作
s=['赵一','赵二','赵三']
with open(r'my01.txt','w') as f:
f.writelines(s)
运行结果:
高淇
高老三
高老四
5. 文本文件的读取
- read([size])
从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。 读取到文件末尾,会返回空字符串。 - readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。 - readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
#coding=utf-8
#提取文件的前4个字符
with open(r'a.txt','r',encoding='utf-8') as f:
print(f.read(8))
运行结果:
one two
#coding=utf-8
#文件较小,一次将文件内容读入到程序中
with open(r'a.txt','r',encoding='utf-8') as f:
print(f.read())
#按行读取一个文件
#coding=utf-8
#按行取一个文件
with open(r'a.txt','r',encoding='utf-8') as f:
while True:
fragment=f.readline() #读取一行内容作为结果返回
if not fragment:
break
else:
print(fragment,end='')
print(f.readline())
#coding=utf-8
#使用迭代器(每次返回一行)读取文本文件
with open(r'a.txt','r',encoding='utf-8') as f:
for a in f:
print(a,end="")
运行结果:
按行输出a
#coding=utf-8
#为文本文件每一行的末尾增加行号
with open(r'a.txt','r',encoding='utf-8') as f:
lines=f.readlines()
lines=[line.rstrip()+'#'+str(index+1)+'\n'for index,line in enumerate(lines)]
#推导式生成列表
#rstrip 清除右边的空格
#enumerate这个函数的基本应用就是用来遍历一个集合对象
with open(r'a.txt','w',encoding='utf-8') as f:
f.writelines(lines)
运行结果:
one two there#1
我是一个学生 我爱学习#2
我在叫赵善松 今年23岁#3
#4
#5
itbaizhi#6
aaaaaaa#7
6. 二进制文件的读取和写入
- 二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指 定二进制模式,从而创建出二进制文件对象。例如:
f = open(r"d:\a.txt", ‘wb’) #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", ‘ab’) #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", ‘rb’) #可读的二进制文件对象
- 创建好二进制文件对象后,仍然可以使用 write()、read()实现文件的读写操作
#coding=utf-8
#读取图片文件,实现文件的拷贝
with open(r'a.jpg','rb') as f:
with open ('a_copy.jpg','wb') as w:
for x in f.readlines():
w.write(x)
7. 文件对象的常用属性和方法
- 文件对象的属性
属性 | 说明 |
---|---|
name | 返回文件的名字 |
mode | 返回文件的打开模式 |
closed | 若文件被关闭则返回Ture |
- 文件对象的打开模式
模式 | 说明 |
---|---|
r | 读模式 |
w | 写模式 |
a | 追加模式 |
b | 二进制模式(可与其他模式组合) |
+ | 读写模式(可以其他模式组合) |
- 文件对象的常用方法
方法名 | 说明 |
---|---|
read(size) | 从文件中读取 size 个字节或字符的内容返回。若省略[size],则读 取到文件末尾,即一次读取文件所有内容 |
readline | 从文本文件中读取一行内容 |
readlines | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入 列表返回 |
write(str) | 将字符串 str 内容写入文件 |
writelines(s) | 将字符串列表 s 写入文件文件,不添加换行符 |
seek(offset,[whence]) | 把文件指针移动到新的位置,offset 表示相对于 whence 的多少个字节的偏移量; offset:off 为正往结束方向移动,set为负往开始方向移动 whence 不同的值代表不同含义: 0: 从文件头开始计算(默认值) 1:从当前位置开始计算 2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
truncate([size] | 不论指针在什么位置,只留下指针前 size 个字节的内容,其余全 部删除; 如果没有传入 size,则当指针当前位置到文件末尾内容全部删除 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |
8.文件任意位置操作
#seek()移动文件指针示例
#coding=utf-8
#seek()移动文件指针示例
with open(r'a.txt','r',encoding='utf-8') as f:
print('文件名是:{0}'.format(f.name)) #返回文件的名字
print(f.tell()) #返回文件指针的当前位置
print('读取的内容:{0}'.format(str(f.readline())))
print(f.tell())
print('读取的内容:{0}'.format(str(f.readline())))
print(f.tell())
print('读取的内容:{0}'.format(str(f.readline())))
运行结果:
文件名是:a.txt
0
读取的内容:ahkjlgh#1
11
读取的内容:gagjakhg#2
23
读取的内容:g;lakhgal#3
9. 使用 pickle 序列化
- 有时候,我们 需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。
- 序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他 地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
- 序列化我们使用:
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
#coding=utf-8
#将对象序列化到文件中
import pickle
with open(r'd.txt','wb') as f:
a1='zfloss'
a2=23
a3='黑龙江大学学生'
pickle.dump(a1,f) #a就是要被序列化的对象,f指的是存储的文件
pickle.dump(a2,f)
pickle.dump(a3,f)
#coding=utf-8
#将获得的数据反序列化成对象
import pickle
with open(r'd.txt','rb') as f:
a1 = pickle.load(f) #从 file 读取数据,反序列化成对象
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
运行结果:
zfloss
23
黑龙江大学学生
10. CSV 文件的操作
- csv是逗号分隔符文本格式,常用于数据交换、Excel 文件和数据库数据的导入和导出。与 Excel 文件不同,CSV 文件中:
1. 没有类型,所有值都是字符串
2. 不能指定字体颜色等样式 不能指定单元格的宽高
3. 不能合并单元格
4. 没有多个工作表
5. 不能嵌入图像图
Python 标准库的模块 csv 提供了读取和写入 csv 格式文件的对象。
我们在 excel 中建立一个简单的表格:
姓名 | 年龄 | 工作 | 薪水 |
---|---|---|---|
赵善松 | 26 | 算法工程师 | 25000 |
付金月 | 27 | 风控情报运营 | 30000 |
小美 | 4 | 吃吃睡睡 | 0 |
(1). csv.reader 对象和 csv 文件读取
#coding=utf-8
#csv.reader 对象于从 csv 文件读取数据
import csv
with open(r'd:\nn.csv','r') as f:
a_csv=csv.reader(f) #创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素
headers=next(a_csv) #获得列表对象,包含标题行的信息
print(headers) #输出标题行信息
for row in a_csv:
print(row) #按行输出表格中的信息
['姓名', '年龄', '工作', '薪水']
['赵善松', '26', '算法工程师', '25000']
['付金月', '27', '风控安全运营', '30000']
['小美', '4', '吃吃睡睡', '0']
(2). csv.writer 对象和 csv 文件写入
#coding=utf-8
#csv.writer() 对象写一个 csv 文件
import csv
headers=['姓名','年龄','职位','薪资']
row=[('赵一','23','人力','6000'),('赵二','23','广告','8000')]
with open(r'e.csv','w') as f:
b_csv=csv.writer(f) #创建 csv 对象
b_csv.writerow(headers) #写入一行(标题)
b_csv.writerows(row) #写入多行(数据)
运行结果:
姓名,年龄,职位,薪资
赵一,23,人力,6000
赵二,23,广告,8000
11. os 和 os.path 模块
- os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行 文件、命令,直接操作文件、目录等等。在系统运维的核心基础。
(1). os 模块-调用操作系统命令
- os.system 可以帮助我们直接调用系统的命令
#coding=utf-8
#os.system 调用 windows 系统的记事本程序
import os
os.system('notepad.exe')
#coding=utf-8
#os.system 调用 windows 系统中 ping 命令
import os
os.system('ping www.baidu.com')
正在 Ping www.a.shifen.com [110.242.68.4] 具有 32 字节的数据:
来自 110.242.68.4 的回复: 字节=32 时间=31ms TTL=54
来自 110.242.68.4 的回复: 字节=32 时间=32ms TTL=54
来自 110.242.68.4 的回复: 字节=32 时间=30ms TTL=54
来自 110.242.68.4 的回复: 字节=32 时间=31ms TTL=54
110.242.68.4 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 30ms,最长 = 32ms,平均 = 31ms
- Linux 是命令行操作更容易,我们可以通过 os.system 可以更加容易的调用相关的命 令;
- 控制台输出中文可能会有乱码问题,可以在 file–>setting–>Editor–>file encoding 中设置
#coding=utf-8
#运行安装好的微信
import os
os.system(r'"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe"')
#路径中有空格到导致无法访问,可以在最外层再加一层引号,让其变成一个整体
运行结果:
(2). os模块-文件和目录操作
- 我们可以通过前面讲的文件对象实现对于文件内容的读写操作。如果,还需要对文件和目录做其他操作,可以使用 os 和 os.path 模块。
- os模块下常用操作文件方法
方法名 | 描述 |
---|---|
remove(path) | 删除指定的文件 |
rename(src,dest) | 重命名文件或目录 |
start(path) | 返回文件的所有属性 |
listdir(path) | 返回path目录下的文件和目录列表 |
- os模块下关于目录操作的相关方法:
方法名 | 描述 |
---|---|
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3/…) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2/path3/…) | 删除多级目录 |
getcwd() | 返回当前工作目录:current work dir |
chdir(path) | 把path设为当前工作目录 |
walk() | 遍历目录树 |
sep | 当前操作系统所使用的路径分隔符 |
#coding=utf-8
#测试 os 模块中,关于文件和目录的操作
import os
#########获取文件和文件夹相关的信息#############
print(os.name) #windows->nt linux 和 unix->posix
print(os.sep) #windows->\ linux 和 unix->/ sep:当前操作系统所使用的路径分隔符
print(repr(os.linesep)) #windows->\r\n linux-->\n\
print(os.stat('file10.py')) #stat返回文件所有属性
#########关于工作目录的操作#############
print(os.getcwd()) #getcwd()返回当前工作目录:current work dir
os.chdir('d:') #把d设为当前工作目录
os.mkdir('图书') #创建一个叫书籍的目录
#########创建目录、创建多级目录、删除#############
os.mkdir('书籍')
os.rmdir('书籍') #相对路径都是相对于当前的工作目录
os.makedirs("电影/港台/周星驰") #makedirs创建多级目录
os.removedirs("电影/港台/周星驰") #removedirs删除多级目录 只能删除空目录,如果目录非空会报错
os.makedirs('../音乐/香港/刘德华') #../指的是上一级目录
os.rename('电影','movie') #改目录的名字,将电影改为movie
dirs=os.listdir('movie') #返回movie目录下的文件和目录列表
print(dirs)
(3).os.path 模块
- os.path模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
方法 | 描述 |
---|---|
isabs(path) | 判断path是否绝对路径 |
isdir(path) | 判断path是否为目录 |
isfile(path) | 判断path是否为文件 |
exists(path) | 判断指定路径的文件是否存在 |
getsize(filename) | 返回文件的大小 |
abspath(path) | 返回绝对路径 |
dirname(path) | 返回目录的路径 |
getatime(filename) | 返回文件的最后访问时间 |
getmtime(filename) | 返回文件的最后修改时间 |
walk(top,func,arg) | 递归方式遍历目录 |
join(path,*paths) | 连接多个path |
split(path) | 对路径进行分隔,以列表形式返回 |
splitext(path) | 从路径分割文件的扩展名 |
#测试 os.path 中常用方法
#coding=utf-8
#测试 os.path 中常用方法
import os
import os.path
##########获得目录、文件基本信息##################
print(os.path.isabs('d:/a.txt')) #判断'd:/a.txt'是否绝对路径 结果为ture or false
print(os.path.isdir('d:/a.txt')) #判断'd:/a.txt'是否是目录
print(os.path.isdir('movie'))
print(os.path.isfile('d:/a.txt')) #判断'd:/a.txt'是否是文件
print(os.path.isfile('movie'))
print(os.path.exists('d:/a.txt')) #判断指定路径的文件是否存在
print(os.path.exists('d:/d.txt'))
print(os.path.exists('movie'))
print(os.path.getsize('d:/a.txt')) #返回文件的大小
print(os.path.abspath('a.txt')) #返回绝对路径
print(os.path.abspath('movie'))
print(os.path.dirname('d:/a.txt')) #输出所在目录
# #######获得创建时间、访问时间、最后修改时间#########
print(os.path.getctime('a.txt')) #返回创建时间
print(os.path.getatime('a.txt')) #返回最后访问时间
print(os.path.getmtime('a.txt')) #返回最后修改时间
# #######对路径进行分割、连接操作#######
path = os.path.abspath('a.txt') #返回绝对路径
print(os.path.split(path)) #返回元组:目录、文件
print(os.path.splitext('a.txt')) #返回元组:路径、扩展名
print(os.path.splitext(path))
print(os.path.join('aa','bb','cc')) #返回路径:aa/bb/cc join:连接多个path
运行结果:
True
False
True
True
False
True
False
True
30
C:\Users\Administrator\PycharmProjects\pythonProject1\a.txt
C:\Users\Administrator\PycharmProjects\pythonProject1\movie
d:/
************************************************
1629873036.3629267
1630042194.200102
1630042194.200102
************************************************
('C:\\Users\\Administrator\\PycharmProjects\\pythonProject1', 'a.txt')
('a', '.txt')
('C:\\Users\\Administrator\\PycharmProjects\\pythonProject1\\a', '.txt')
aa\bb\cc
#coding=utf-8
#列出指定目录下所有的.py 文件,并输出文件名法
import os
import os.path
path = os.getcwd() #getcwd():返回当前工作目录
file_list = os.listdir('movie') #列出子目录和子文件
for filename in file_list:
pos = filename.rfind('.')
if filename[pos+1]=='py':
print(filename,end='\t')
print('########################')
file_list2 = [filename for filename in os.listdir(path) if filename.endswith('.py')]
for filename in file_list2:
print(filename,end='\t')
运行结果:
file01.py file03.py file04.py file08.py file09.py file10.py file11.py file12.py file13.py file14.py file1`.py file2.py file5.py file6.py file7.py main.py o1.py o2.py o3.py o4.py
(4).walk()递归遍历所有文件和目录
- os.walk()方法:
返回一个3个元素的元组,(dirpath,dirnames,filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
#coding=utf-8
#使用walk()递归遍历所有文件和目录
import os
all_file=[] #建立一个列表
path = os.getcwd() #getcwd:返回当前工作目录
list_files=os.walk(path)
for dirpath,dirnames,filenames in list_files:
for dir in dirnames:
all_file.append(os.path.join(dirpath,dir)) #join连接多个path (将文件夹的名字和路径相连)
for name in filenames:
all_file.append(os.path.join(dirpath,name)) #将文件和路径相连
# 打印子目录和子文件
for file in all_file:
print(file)
运行结果(根目录不同,结果也不同):
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea
C:\Users\Administrator\PycharmProjects\pythonProject2\mm
C:\Users\Administrator\PycharmProjects\pythonProject2\04.py
C:\Users\Administrator\PycharmProjects\pythonProject2\main.py
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\inspectionProfiles
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\.gitignore
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\misc.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\modules.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\pythonProject2.iml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\workspace.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\inspectionProfiles\profiles_settings.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\mm\tt
(5).shutil 模块(拷贝和压缩)
- shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做 文件和文件夹的压缩、解压缩操作。
- os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操 作,这些 os 模块都没有提供。
#coding=utf-8
#copy文件内容
import shutil
shutil.copy('a.txt','a_copt.txt') #前面的文件为被copy的文件,后面的是新文件
# import shutil
# shutil.copy('a.txt','a_copt.txt')
#实现递归的拷贝文件夹内容(使用 shutil 模块)
import shutil
shutil.copytree('NBA','美职篮',ignore=shutil.ignore_patterns('*.html','*.htm'))#将文件夹“nba”下面的内容拷贝到文件夹
#coding=utf-8
# 压缩:将指定多个文件压缩到一个zip文件
import shutil
import zipfile
z=zipfile.ZipFile('a.zip','w')
z.write('1.txt')
z.write('2.txt')
z.close()
#coding=utf-8
#实现将压缩包解压缩到指定文件夹(使用 shutil 模块)
import shutil
import zipfile
z2 = zipfile.ZipFile('a.zip','r') #读一个压缩文件
z2.extractall('d:/') #设置解压的地址
z2.close()
(6).递归算法
- 递归结构包括两个部分
- 定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就 是递归的结束条件。
- 递归体。解答:什么时候需要调用自身方法。
#coding=utf-8
#使用递归求n!
def f(n):
if n==1:
return 1
else:
return n*f(n-1)
a=f(10)
print(a)
- 递归的缺陷 简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多,在递 归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。
#coding=utf-8
#使用递归遍历目录下所有文件
import os
allfile = [] #建立一个列表
def getFiles(path,level):
childFiles=os.listdir(path) #listdir返回path目录下的文件和目录列表
for file in childFiles:
filepath=os.path.join(path,file)
if os.path.isdir(filepath): #isdir:判断filepath是否为目录
getFiles(filepath, level+1) #如果是目录就接着往下走
allfile.append('\t'*level+filepath)
getFiles(os.getcwd(),0)
for f in reversed(allfile): #调转
print(f)
运行结果:
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\.gitignore
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\inspectionProfiles\profiles_settings.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\inspectionProfiles
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\misc.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\modules.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\pythonProject2.iml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea\workspace.xml
C:\Users\Administrator\PycharmProjects\pythonProject2\.idea
C:\Users\Administrator\PycharmProjects\pythonProject2\04.py
C:\Users\Administrator\PycharmProjects\pythonProject2\1.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\2.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\a.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\a.zip
C:\Users\Administrator\PycharmProjects\pythonProject2\a_copt.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\e1.py
C:\Users\Administrator\PycharmProjects\pythonProject2\e2.py
C:\Users\Administrator\PycharmProjects\pythonProject2\main.py
C:\Users\Administrator\PycharmProjects\pythonProject2\mm\tt
C:\Users\Administrator\PycharmProjects\pythonProject2\mm
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\76人\色蓝床垫子.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\76人
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\公牛
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\篮网\champion.html
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\篮网
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\雄鹿
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\黄蜂
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\勇士\kumingga.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\勇士
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\太阳
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\快船\11.htm
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\快船
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\湖人
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\火箭
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west
C:\Users\Administrator\PycharmProjects\pythonProject2\NBA
C:\Users\Administrator\PycharmProjects\pythonProject2\o5.py
C:\Users\Administrator\PycharmProjects\pythonProject2\o6.py
C:\Users\Administrator\PycharmProjects\pythonProject2\篮球2\bb.zip
C:\Users\Administrator\PycharmProjects\pythonProject2\篮球2
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east\76人\色蓝床垫子.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east\76人
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east\公牛
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east\篮网
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east\雄鹿
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east\黄蜂
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west\勇士\kumingga.txt
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west\勇士
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west\太阳
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west\快船
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west\湖人
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west\火箭
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west
C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮