文章目录

  • 一、异常
    • 1.异常机制本质
    • 2. 异常解决的关键:定位
    • 3. try...一个 except 结构
    • 4. try...多个 except 结构
    • 5.try...except...else 结构
    • 6. try...except...else...finally 结构
    • 7. return 语句和异常处理问题
    • 8. 常见异常的解决
    • 9.常见异常汇总
    • 10. with上下文管理
    • 11. trackback 模块
    • 12. 自定义异常类
    • 13. pycharm开发环境的调试
      • (1).断点
      • (2).进入调试视图
      • (3).调试操作区
  • 二、文件操作(IO 技术)
    • 1. 文本文件和二进制文件
      • (1).文本文件
      • (2).二进制文件
    • 2. 文件操作相关模块概述
    • 3. 创建文件对象open()
    • 4.文本文件写入
      • (1).基本的文件写入操作
      • (2).常用编码介绍
      • (3). 中文乱码问题
      • (4).write()/writelines()写入数据
      • (5). close()关闭文件流
      • (6). with 语句(上下文管理器)
    • 5. 文本文件的读取
    • 6. 二进制文件的读取和写入
    • 7. 文件对象的常用属性和方法
    • 8.文件任意位置操作
    • 9. 使用 pickle 序列化
    • 10. CSV 文件的操作
      • (1). csv.reader 对象和 csv 文件读取
      • (2). csv.writer 对象和 csv 文件写入
    • 11. os 和 os.path 模块
      • (1). os 模块-调用操作系统命令
      • (2). os模块-文件和目录操作
      • (3).os.path 模块
      • (4).walk()递归遍历所有文件和目录
      • (5).shutil 模块(拷贝和压缩)
      • (6).递归算法

一、异常

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/0print('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('退出程序')breakexcept: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. 常见异常的解决

  1. SyntaxError:语法错误
     int a = 3
     int a =3
       ^
    SyntaxError: invalid syntax
  2. NameError:尝试访问一个没有申明的变量
     print(a)
     print(a)
    NameError: name ‘a’ is not defined
  3. ZeroDivisionError:除数为 0 错误(零除错误)
     a = 3/0
     a = 3/0
    ZeroDivisionError: division by zero
  4. ValueError:数值错误
     float(“gaoqi”)
     float(“gaoqi”)
    ValueError: could not convert string to float: ‘gaoqi’
  5. TypeError:类型错误
    123+“abc”
    123+“abc”
    TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
  6. AttributeError:访问对象的不存在的属性
     a=100
     a.sayhi()
     a.sayhi()
    AttributeError: ‘int’ object has no attribute ‘sayhi’
  7. IndexError:索引越界异常
     a = [4,5,6]
     a[10]
     a[10]
    IndexError: list index out of range
  8. 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 tracebacktry: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 zeroProcess finished with exit code 0
# 使用 traceback 将异常信息写入日志文件
import tracebacktry: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): #继承Exceptiondef __init__(self,errorInfo):Exception.__init__(self)  #调一下父类self.errorInfo=errorInfodef __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. 文本文件的读取

  1. read([size])
    从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。 读取到文件末尾,会返回空字符串。
  2. readline()
    读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
  3. 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:breakelse: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#111
读取的内容:gagjakhg#223
读取的内容: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=23a3='黑龙江大学学生'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.pathpath = 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 zipfilez=zipfile.ZipFile('a.zip','w')
z.write('1.txt')
z.write('2.txt')
z.close()
#coding=utf-8
#实现将压缩包解压缩到指定文件夹(使用 shutil 模块)import shutil
import zipfilez2 = zipfile.ZipFile('a.zip','r') #读一个压缩文件
z2.extractall('d:/')  #设置解压的地址
z2.close()

(6).递归算法

  • 递归结构包括两个部分
  • 定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就 是递归的结束条件。
  • 递归体。解答:什么时候需要调用自身方法。
#coding=utf-8
#使用递归求n!
def f(n):if n==1:return 1else: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\.gitignoreC:\Users\Administrator\PycharmProjects\pythonProject2\.idea\inspectionProfiles\profiles_settings.xmlC:\Users\Administrator\PycharmProjects\pythonProject2\.idea\inspectionProfilesC:\Users\Administrator\PycharmProjects\pythonProject2\.idea\misc.xmlC:\Users\Administrator\PycharmProjects\pythonProject2\.idea\modules.xmlC:\Users\Administrator\PycharmProjects\pythonProject2\.idea\pythonProject2.imlC:\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.pyC:\Users\Administrator\PycharmProjects\pythonProject2\mm\tt
C:\Users\Administrator\PycharmProjects\pythonProject2\mmC:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\76人\色蓝床垫子.txtC:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\76人C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\公牛C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\east\篮网\champion.htmlC:\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\eastC:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\勇士\kumingga.txtC:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\勇士C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\太阳C:\Users\Administrator\PycharmProjects\pythonProject2\NBA\west\快船\11.htmC:\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.pyC:\Users\Administrator\PycharmProjects\pythonProject2\篮球2\bb.zip
C:\Users\Administrator\PycharmProjects\pythonProject2\篮球2C:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\east\76人\色蓝床垫子.txtC:\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\美职篮\eastC:\Users\Administrator\PycharmProjects\pythonProject2\美职篮\west\勇士\kumingga.txtC:\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\美职篮

python_DAY09相关推荐

最新文章

  1. 【转载】 stm32之PWM
  2. [转] 使用Spring MVC构建REST风格WEB应用
  3. 四驱麦克纳姆轮运行原理
  4. 需求评审五个维度框架分析及其带来的启示-4-需求条目化管理
  5. 转:canvas--放大镜效果
  6. ArcGIS 10.2中栅格数据的属性表问题
  7. angular4输入有效性_Angular 2 用户输入
  8. 牛客网——与7无关的数
  9. nginx log 记录请求的头信息
  10. uc影音java_uc影,
  11. pcshare完美版
  12. 心理测试软件需求分析报告,大学生心理测试软件心理测评档案管理系统
  13. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day39】—— 数据库6
  14. RxJava3.x入门(七)——背压策略
  15. 如何在腾讯云快速注册域名
  16. 巨型计算机卡通,动漫史上十大超巨型机体
  17. TCP/IP可能有你不知道的事
  18. 诺基亚java闪退_手机程序闪退怎么办?使用这三种办法,即可轻松搞定
  19. KVM和Xen虚拟化有什么区别?Xen和KVM优缺点对比
  20. Wampserver 如何连接远程数据库,云数据库

热门文章

  1. html幽灵空白节点
  2. ppt提示内存或系统资源不足_Mac 磁盘空间不足-真的需要 CleanMyMacX?「上」
  3. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java果蔬信息网站25890
  4. mysql添加好友_添加好友功能实现思路
  5. 哪些手写文字图片识别软件好用?分享这三款好用的软件
  6. 小程序游戏的爆发式增长风口:头条系与微信生态
  7. org.apache.http.impl.client 如何请求 HTTPS 的接口?
  8. 实验四,字符串的基本操作(Python,头歌)
  9. 妲己机器人怎么升级固件_喵驾车机版怎么升级 固件升级方法
  10. Micro Focus VM Explorer 7 Install