python_DAY09

一、异常

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. 常见异常的解决

  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 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. 文本文件的读取

  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:
            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\美职篮
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值