python深入与提高

发布时间:2024年01月17日

python深入与提高

一、异常机制

1.try和except结构
try…一个except结构

try...except是最常见的异常处理结构。

try:
    被监控的可能引发异常的语句块
except BaseException [as e]:
    异常处理语句块
try…多个except结构

只有没有异常时,才会被执行

try:
    被监控的、可能引发异常的语句块
except Exception1:
    处理Exception1的语句块
except Exception2:
    处理Exception2的语句块
[...]
except BaseException:
    处理可能遗漏的异常的语句块
try…except…finally结构:

无论是否发生异常都会被执行;通常用来释放try块中申请的资源。

try:
  a = input("请输入一个被除数:")
  b = input("请输入一个除数:")
  c = float(a)/float(b)
except BaseException as e:
  print(e)
else:
  print(c)
finally:
  print("我是finally中的语句,无论发生异常与否,都执行!")
	# 一般用于f.close()文件的关闭
return语句和异常处理问题

由于return有两种作用:结束方法运行、返回值。我们一般不把return放到异常处理结构中,而是放到方法最后。

2.常见异常汇总

Python中的异常都派生自BaseException

  1. SyntaxError:语法错误
  2. NameError:尝试访问一个没有声明的变量
  3. ZeroDivisionError:除数为0错误(零除错误)
  4. ValueError:数值错误
  5. TypeError:类型错误
  6. AttributeError:访问对象的不存在的属性
  7. IndexError:索引越界异常
  8. KeyError:字典的关键字不存在
异常名称说明
ArithmeticError所有数值计算错误的基类
AssertionError断言语句失败
AttributeError对象没有这个属性
BaseException所有异常的基类
DeprecationWarning关于被弃用的特征的警告
EnvironmentError操作系统错误的基类
EOFError没有内建输入,到达EOF 标记
Exception常规错误的基类
FloatingPointError浮点计算错误
FutureWarning关于构造将来语义会有改变的警告
GeneratorExit生成器(generator)发生异常来通知退出
ImportError导入模块/对象失败
IndentationError缩进错误
IndexError序列中没有此索引(index)
IOError输入/输出操作失败
KeyboardInterrupt用户中断执行(通常是输入^C)
KeyError映射中没有这个键
LookupError无效数据查询的基类
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
NotImplementedError尚未实现的方法
OSError操作系统错误
OverflowError数值运算超出最大限制
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
StandardError所有的内建标准异常的基类
StopIteration迭代器没有更多的值
SyntaxErrorPython 语法错误
SyntaxWarning可疑的语法的警告
SystemError一般的解释器系统错误
SystemExit解释器请求退出
TabErrorTab 和空格混用
TypeError对类型无效的操作
UnboundLocalError访问未初始化的本地变量
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeErrorUnicode 相关的错误
UnicodeTranslateErrorUnicode 转换时错误
UserWarning用户代码生成的警告
ValueError传入无效的参数
Warning警告的基类
WindowsError系统调用失败
ZeroDivisionError除(或取模)零 (所有数据类型)
3.with上下文管理

with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。

with open("d:/bb.txt") as f:
  for line in f:
    print(line)
4.traceback模块和生成异常日志

使用traceback模块打印异常信息

异常信息会拼接到a.log文件中

import traceback
try:
  print("step1")
  num = 1/0
except:
  with open("d:/a.log","a") as f:
    traceback.print_exc(file=f)
5.自定义异常
class AgeError(Exception):
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo = errorInfo

    def __str__(self):
        return str(self.errorInfo)+",年龄错误!应该在1-150之间"

if __name__ == "__main__":
    age = int(input("请输入一个年龄:"))
    if(age<1 or age>150):
        raise AgeError(age)
    else:
        print("正常的年龄:",age)

二、文件处理

1.file文件操作
文件操作相关模块概述

Python标准库中,如下是文件操作相关的模块,我们会陆续给大家介绍。

名称说明
io模块文件流的输入和输出操作 input output
os模块基本操作系统功能,包括文件操作
glob模块查找符合特定规则的文件路径名
fnmatch模块使用模式来匹配文件路径名
fileinput模块处理多个输入文件
filecmp模块用于文件的比较
csv模块用于csv文件处理
pickle和cPickle用于序列化和反序列化
xml包用于XML数据处理
bz2、gzip、zipfile、zlib、tarfile用于处理压缩和解压缩文件(分别对应不同的算法)
创建文件对象open()

f = open(r"d:\b.txt","w")

r——转义 w——打开方式

模式描述
r读 read模式
w写 write模式。如果文件不存在则创建;如果文件存在,则重写新内容;
a追加append模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
b二进制binary模式(可与其他模式组合使用)
+读、写模式(可与其他模式组合使用)

文本文件对象和二进制文件对象的创建:

  1. 如果没有增加模式b,则默认创建的是文本文件对象,处理的基本单元是“字符”。
  2. 如果是二进制模式b,则创建的是二进制文件对象,处理的基本单元是“字节”。
文本文件的写入

文本文件的写入一般就是三个步骤:

  1. 创建文件对象
  2. 写入数据
  3. 关闭文件对象
#f = open(r"b.txt","w",encoding="utf-8") 中文乱码问题解决
with open(r"a.txt","a") as f:
    s = "hello\nworld\n"
    f.writelines() # 把字符串列表写入文件中,不添加换行符
  	f.write(s) # 将字符串写入文件
关闭文件流
  • 当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象。

  • 一般加在finally后面

  • with关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。

文本文件的读取
  1. read([size]) 从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件。 读取到文件末尾,会返回空字符串(相当于移动到末尾的指针,重复调用无意义——空字符串)。

  2. readline()

    读取一行内容作为结果返回。读取到文件末尾,会返回空字符串

  3. readlines()

    文本文件中,每一行作为一个字符串存入列表中,返回该列表

with open("b.txt","r",encoding="gbk") as f:
    list1 = f.readlines() # 将每行数据读取到列表中
    list2 = [line.rstrip()+"#"+str(index) for index,line in zip(range(1,len(list1)+1),list1)]
    print("原文件内容:",list1)
    print("添加序列号后文件内容",list2)

with open("b.txt","w",encoding="gbk") as f:
    f.writelines(list2)
二进制文件的读取和写入
f = open(r"d:\a.txt", 'wb') #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", 'ab') #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", 'rb') #可读的二进制文件对象
with open('logo1.png','rb') as srcFile,open("ddd.png","wb") as destFile:
    for line in srcFile:
        destFile.write(line)
汇总
方法名说明
read([size])从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline()从文本文件中读取一行内容
readlines()把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str)将字符串str内容写入文件
writelines(s)将字符串列表s写入文本文件,不添加换行符
seek(offset [,whence])把文件指针移动到新的位置,offset表示相对于whence的多少个字节的偏移量;offset:off为正往结束方向移动,为负往开始方向移动;whence不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算
tell()返回文件指针的当前位置
truncate([size])不论指针在什么位置,只留下指针前size个字节的内容,其余全部删除;如果没有传入size,则当指针当前位置到文件末尾内容全部删除
flush()把缓冲区的内容写入文件,但不关闭文件
close()把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源
#文件读取
f = open("b.txt","r")
#content = f.read() #读取全部内容
#content = f.readline() #按行读取(一次读一行)
for line in f:
    print(line) #读取全部内容
#文件写入
with open("b.txt","a",encoding="utf-8") as f:
    f.write("这是追加内容")
    f.close()
f = open("b.txt","r")
f.seek(0, 0) # 从文件头开始读取
content1 = f.readline() 
print(content1)
f.seek(0, 1) # 从当前位置开始读取
content2 = f.readline()
print(content2)
print(f.tell()) # 返回当前的读取位置
f.close()

三、序列化

import pickle

with open("data.dat","wb") as f:
    name = "Lily"
    age = 18
    score = [90,93,92]
    resume = {'name':name,'age':age,'score':score}

    pickle.dump(resume,f) # resume是被序列化的对象,f是要存储的文件

with open("data.dat","rb") as f:
    resume2 = pickle.load(f) # load 读取数据,反序列化成对象
    print(resume2)

四、CSV文件的操作

csv是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。

  • 值没有类型,所有值都是字符串
  • 不能指定字体颜色等样式
  • 不能指定单元格的宽高,不能合并单元格
  • 没有多个工作表
  • 不能嵌入图像图表
import csv

with open(r"d:\a.csv") as a:
  a_csv = csv.reader(a)    #创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
  headers = next(a_csv)    #获得列表对象,包含标题行的信息
  print(headers)
  for row in a_csv:      #循环打印各行内容
    print(row)
import csv

headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("1001","张三",18,"学2","50000"),("1002","李四",19,"学10","30000")]

with open(r"d:\b.csv","w") as b:
  b_csv = csv.writer(b)    #创建csv对象
  b_csv.writerow(headers)   #写入一行(标题)
  b_csv.writerows(rows)    #写入多行(数据)

五、OS模块

1.调用操作系统可执行文件

os模块可以帮助我们直接对操作系统进行操作

方法名描述
remove(path)删除指定的文件
rename(src,dest)重命名文件或目录
stat(path)返回文件的所有属性(文件和文件夹)
listdir(path)返回path目录下的文件和目录列表

os模块下关于目录操作的相关方法,汇总如下:

方法名描述
mkdir(path)创建目录
makedirs(path1/path2/path3/…)创建多级目录
rmdir(path)删除目录
removedirs(path1/path2…)删除多级目录
getcwd()返回当前工作目录:current work dir
chdir(path)把path设为当前工作目录
walk()遍历目录树
sep当前操作系统所使用的路径分隔符
import os
os.system("calc.exe") #打开系统软件(计算器)
# 打印基本信息
print(os.name) #widows-->nt linux-->posix
print(os.sep) #windows-->\   linux-->/
print(repr(os.linesep)) #windows-->\r\n   linux-->\n
a = '3'
print(a) #-->3
print(repr(a)) #repr可以显示数据信息
2.os.path模块

os.path模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作

方法描述
isabs(path)判断path是否绝对路径(absolute)
isdir(path)判断path是否为目录
isfile(path)判断path是否为文件
exists(path)判断指定路径的文件是否存在
getsize(filename)返回文件的大小
abspath(path)返回绝对路径
dirname§返回目录的路径
getctime(filename)返回文件的创建时间(create)
getatime(filename)返回文件的最后访问时间(active)
getmtime(filename)返回文件的最后修改时间(modify)
walk(top,func,arg)递归方式遍历目录
join(path,*paths)连接多个path
split(path)对路径进行分割,以列表形式返回
splitext(path)从路径中分割文件的扩展名
# 列出当前目录下所有的.py文件
path = os.getcwd()
file_list = os.listdir(path)
print(file_list)
for file_name in file_list:
    pos = file_name.rfind(".")
    if file_name[pos+1:] == 'py':
        print(file_name)

print("############")
file_list2 = [file_name for file_name in os.listdir(path) if file_name.endswith("py")]
print(file_list2)
3.os.walk

os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

top:是要遍历的目录。topdown:可选,True,先遍历top目录再遍历子目录。

返回三元组(rootdirsfiles):

root:当前正在遍历的文件夹本身

dirs:一个列表,该文件夹中所有的目录的名字

files:一个列表,该文件夹中所有的文件的名字

# 遍历所有的目录的名字
path = os.getcwd()
list_files = os.walk(path,topdown=False)
for root,dirs,files in list_files:
    for name in files:
        print(os.path.join(root,name)) # 列出当前目录下的子文件
    for name in dirs:
        print(os.path.join(root,name)) # 列出当前目录下的子文件夹

六、shutil模块

shutil模块是python标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。

import shutil
#"音乐"文件夹不存在才能用
shutil.copytree("电影/学习","音乐",ignore=shutil.ignore_patterns("*.html","*.htm"))
压缩和解压缩:
import shutil
# 压缩一个文件
shutil.make_archive("d:/test","zip","d:/aaa")

# 压缩:将指定的多个文件压缩到一个zip文件
z = zipfile.ZipFile("a.zip","w")
z.write("a.txt")
z.write("b.txt")
z.write("c.txt")
z.close()

# 解压缩
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d://")
z2.close()
递归算法——目录树结构的展示
import os

def my_print_file(path,level):
    child_files = os.listdir(path)
    for file in child_files:
        file_path = os.path.join(path,file)
        print("\t"*level+file_path[file_path.rfind(os.sep)+1:]) # 从右往前找第一个分隔符
        if os.path.isdir(file_path):
            my_print_file(file_path,level+1)
文章来源:https://blog.csdn.net/qq_74060887/article/details/135630869
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。