python-14-序列化反序列化和异常处理

目录

01-作业1

02-作业2

03-文件操作

04-实现文件拷贝功能

05-文件拷贝优化

06-csv文件的读写

07-将数据写入到内存

08-sys模块的使用

09-json的使用

10-pickle模块的使用

11-异常处理

12-except语句

13-异常的使用场景


01-作业1

class Point(object):
    # point 方法在创建时,需要两个int类型的参数,用来表示x,y坐标
    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y


class Rectangle(object):
    def __init__(self, top_left: Point, bottom_right: Point):
        self.top_left = top_left
        self.bottom_right = bottom_right

    def get_area(self):
        length = abs(self.bottom_right.x - self.top_left.x)
        width = abs(self.top_left.y - self.bottom_right.y)
        return length * width

    def is_inside(self, point):
        # if self.bottom_right.x >= point.x >= self.top_left.x and self.top_left.y >= point.y >= self.bottom_right.y:
        #     return True
        # else:
        #     return False
        return self.bottom_right.x >= point.x >= self.top_left.x and self.top_left.y >= point.y >= self.bottom_right.y


# p1 = Point(4, 20)  # 定义左上角的点
# p2 = Point(30, 8)  # 定义右下角的点
#
# r = Rectangle(p1, p2)  # 把左上角和有下角的点传递给矩形
# print(r.get_area())
#
# p = Point(20, 30)
# print(r.is_inside(p))
#
# x = Point(20, 20)
# print(r.is_inside(x))


class Calculator(object):
    # def add(self, a, b):
    #     return a + b
    @staticmethod
    def add(a, b):
        return a + b


# c = Calculator()  # 有必要创建一个实例对象吗?
# print(c.add(4, 5))
print(Calculator.add(4, 5))

Python进阶-静态方法(@staticmethod)

@staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包
放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性

class cal:
    cal_name = '计算器'
    def __init__(self,x,y):
        self.x = x
        self.y = y

    @property           #在cal_add函数前加上@property,使得该函数可直接调用,封装起来
    def cal_add(self):
        return self.x + self.y

                        #在cal_info函数前加上@classmethon,则该函数变为类方法,
    @classmethod        #该函数只能访问到类的数据属性,不能获取实例的数据属性
    def cal_info(cls):  #python自动传入位置参数cls就是类本身
        print('这是一个%s'%cls.cal_name)   #cls.cal_name调用类自己的数据属性

    @staticmethod       #静态方法 类或实例均可调用
    def cal_test(a,b,c): #改静态方法函数里不传入self 或 cls
        print(a,b,c)
c1 = cal(10,11)
cal.cal_test(1,2,3)     #>>> 1 2 3
c1.cal_test(1,2,3)      #>>> 1 2 3

02-作业2

class Auto(object):
    def __init__(self, color, weight, speed=0, wheel_count=4):
        self.color = color
        self.weight = weight
        self.speed = speed
        self.wheel_count = wheel_count

    def change_speed(self, x):
        """
        修改车速
        :param x: 表示要修改的车速值。如果是正数,表示加速,负数表示减速,0表示停车
        """
        if x == 0:  # 如果传递的参数0,表示要停车
            self.speed = 0
            return

        self.speed += x
        if self.speed <= 0 and x < 0:
            self.speed = 0
            return


class CarAuto(Auto):
    def __init__(self, color, weight, ac, navigator, speed=0, wheel_count=4):
        # self.color = color
        # self.weight = weight
        # self.speed = speed
        # self.wheel_count = wheel_count
        super(CarAuto, self).__init__(color, weight, speed, wheel_count)
        self.navigator = navigator
        self.ac = ac


car = CarAuto('白色', 1.6, '美的', 'iOS', 10, 5)
print(car.color)
print(car.weight)
print(car.navigator)
print(car.ac)
print(car.speed)
print(car.wheel_count)

03-文件操作

# Python里使用  open 内置函数用来打开一个文件
# file:文件的路径。相对路径和绝对路径
# mode:打开文件的模式。 r:只读  w:写入  b:二进制  t:文本形式打开
# mode 默认使用的 rt
# encoding:用来指定文件的编码方式。windows系统里,默认是gbk

# file = open('xxx.txt')  # 报错,默认是以 rt 打开,如果文件不存在,会报错

# file = open('sss.txt', 'w', encoding='utf8')  # 创建一个新的文件
# file.write('你好')

# file = open('sss.txt', 'rt', encoding='utf8')
# print(file.read())  # 将所有的数据都读取出来

# readline只读取一行数据
# while True:
#     content = file.readline()
#     print(content)
#     if content == '':
#         break

# 读取所有行的数据,保存到一个列表里
# x = file.readlines()
# print(x)

# x = file.read(10)  # 指的是读取的长度


# 优化:没有绝对的优化,除非提升硬件

file = open('../02-视频/02-作业讲解2.mp4', 'rb')
# print(file.read())
while True:
    content = file.read(1024)
    if not content:
        break
    print(content)

file.close()
open 内置函数用来打开一个文件
# file:文件的路径。相对路径和绝对路径
# mode:打开文件的模式。 r:只读  w:写入  b:二进制  t:文本形式打开
# mode 默认使用的 rt
# encoding:用来指定文件的编码方式。windows系统里,默认是gbk
file = open('../02-视频/02-作业讲解2.mp4', 'rb')
# print(file.read())

04-实现文件拷贝功能

import os

file_name = input('请输入一个文件路径:')

if os.path.isfile(file_name):  # 判断是否是文件
    # 打开旧文件
    old_file = open(file_name, encoding='utf8')

    # sss.txt ==> sss.txt.bak.txt
    # 'sss.txt' + 'bak' + 'txt'
    # names = file_name.rpartition('.')  # ('sss.txt','.','txt')
    # new_file_name = names[0] + '.bak.' + names[2]

    names = os.path.splitext(file_name)  # ('xxx', '.txt')
    # # print(names)
    new_file_name = names[0] + '.bak' + names[1]
    new_file = open(new_file_name, 'w', encoding='utf8')  # 打开一个新文件用于写入

    # 把旧文件的数据读取出来写入到新的文件
    new_file.write(old_file.read())

    new_file.close()
    old_file.close()
else:
    print('您输入的文件不存在')

重点理解,常用

05-文件拷贝优化

import os

file_name = input('请输入一个文件路径:')
if os.path.isfile(file_name):
    old_file = open(file_name, 'rb')  # 以二进制的形式读取文件

    names = os.path.splitext(file_name)
    new_file_name = names[0] + '.bak' + names[1]

    new_file = open(new_file_name, 'wb')  # 以二进制的形式写入文件

    while True:
        content = old_file.read(1024)  # 读取出来的内容是二进制
        new_file.write(content)
        if not content:
            break

    new_file.close()
    old_file.close()
else:
    print('您输入的文件不存在')

06-csv文件的读写

import csv  # 系统内置模块

# file = open('demo.csv', 'w', encoding='utf8', newline='')  # 打开一个文件
# w = csv.writer(file)

# w.writerow(['name', 'age', 'score', 'city'])
# w.writerow(['zhangsan', 19, 90, '襄阳'])
# w.writerow(['lisi', 19, 90, '纽约'])

# w.writerows(
#     [
#         ['name', 'age', 'score', 'city'],
#         ['zhangsan', 19, 90, '襄阳'],
#         ['lisi', 19, 90, '纽约']
#     ]
# )

file = open('info.csv', 'r', encoding='utf8', newline='')
r = csv.reader(file)
for data in r:
    print(data)

file.close()
file = open('info.csv', 'r', encoding='utf8', newline='')
r = csv.reader(file)
for data in r:
    print(data)

file.close()

07-将数据写入到内存

# 将数据写入到内存涉及到  StringIO和BytesIO两个类
from io import StringIO, BytesIO
from wsgiref import simple_server

s_io = StringIO()
# s_io.write('hello')  # 把数据写入到了内存里缓存起来了
# s_io.write('good')
# print(s_io.getvalue())
# s = ''
# s += 'hello'
# s += 'word'
# print(s)

# file 需要的是一个文件流对象
# print('hello', file=open('sss.txt', 'w'))
print('good', file=s_io)
print('yes', file=s_io)
print('ok', file=s_io)
print(s_io.getvalue())
s_io.close()

b_io = BytesIO()
b_io.write('你好'.encode('utf8'))
print(b_io.getvalue().decode('utf8'))
b_io.close()

08-sys模块的使用

import sys

# sys.stdin  接收用户的输入,说白了就是读取键盘里输入的数据

# stdout和stdin默认都是控制台
# sys.stdout 标准输出
# sys.stderr 错误输出

s_in = sys.stdin  # input就是读取 sys.stdin 里的数据

# while True:
#     content = s_in.readline().rstrip('\n')  # hello\n  ==>hello   \n==> ''
#     if content == '':
#         break
#     print(content)
m = open('stdout.txt', 'w', encoding='utf8')
sys.stdout = m
print('hello')
print('yes')
print('good')
m.close()

# err == > error 错误
x = open('stderr.txt', 'w', encoding='utf8')
sys.stderr = x
print(1 / 0)
x.close()

09-json的使用

# 序列化:将数据从内存持久化保存到硬盘的过程
# 反序列化:将数据从硬盘加载到内存的过程

# write时,只能写入字符串或者二进制
# 字典、列表、数字等都不能直接写入到文件里

# 将数据转换成为字符串: repr/str  使用json模块
# json 本质就是字符串,区别在于json里要是用双引号表示字符串
# 将数据转换成为二进制: 使用pickle模块

import json

names = ['zhangsan', 'lisi', 'jack', 'tony']
# x = json.dumps(names)  # dumps 的作用是将数据转换成为字符串
# # print(x)  # ' ["zhangsan", "lisi", "jack", "tony"] '
#
file = open('names.txt', 'w', encoding='utf8')
# file.write(x)


#  json里将数据持久有两个方法:
# dumps:将数据转换成为json字符串,不会将数据保存到文件里。
# dump: 将数据转换成为json字符串的同时写入到指定文件。

# json 反序列化也有两个方法:
# loads: 将json字符串加载成为Python里的数据
# load: 读取文件,把读取的内容加载成为Python里的数据
json.dump(names, file)
file.close()

x = '{"name":"zhangsan","age":18}'  # 符合json规则的字符串
p = json.loads(x)
# print(p, type(p))
print(p['name'])

# load 读取一个文件,并把文件里的json字符串加载成为一个对象
file1 = open('names.txt', 'r', encoding='utf8')
y = json.load(file1)
print(y)
print(y[0])
file1.close()


class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print(self.name + '正在吃东西')


p = Person('henry', 20)

x = json.dumps(p.__dict__)
y = json.loads(x)

print(y)
# 序列化:将数据从内存持久化保存到硬盘的过程
# 反序列化:将数据从硬盘加载到内存的过程

# write时,只能写入字符串或者二进制
# 字典、列表、数字等都不能直接写入到文件里

# 将数据转换成为字符串: repr/str  使用json模块
# json 本质就是字符串,区别在于json里要是用双引号表示字符串
# 将数据转换成为二进制: 使用pickle模块

10-pickle模块的使用

# python 里存入数据只支持存入 字符串 和 二进制
# json: 将Python里的数据(str/list/tuple/dict/int/float/bool/None)等转换成为对应的json
# pickle: 将Python里任意的对象转换成为二进制

import pickle

# 序列化  dumps:将Python数据转换成为二进制
#         dump:将Python数据转换成为二进制,同时保存到指定文件
# 反序列化 loads:将二进制加载成为Python数据
#         load:读取文件,并将文件的二进制内容加载成为Python数据
names = ['张三', '李四', '杰克', '亨利']


# b_names = pickle.dumps(names)
#
# file = open('names.txt', 'wb')
# file.write(b_names)  # 写入的是二进制,不是存文本
# file.close()
#
# file1 = open('names.txt', 'rb')
# x = file1.read()
# y = pickle.loads(x)
# print(y)
# file1.close()

# file2 = open('names.txt', 'wb')
# pickle.dump(names, file2)
# file2.close()
#
# file3 = open('names.txt', 'rb')
# pickle.load(file3)

class Dog(object):
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def eat(self):
        print(self.name + '正在吃东西')


d = Dog('大黄', '白色')

# 保存到文件里
pickle.dump(d, open('dog.txt', 'wb'))

# 从文件里加载出来
dd = pickle.load(open('dog.txt', 'rb'))
dd.eat()
print(dd.name, dd.color)

 

11-异常处理

# 在程序运行过程中,由于编码不规范等造成程序无法正常执行,此时程序就会报错
# 健壮性:很多编程语言都有异常处理机制。


def div(a, b):
    return a / b


try:
    x = div(5, 2)
    print('呵呵呵')
except Exception as e:  # 如果程序出错了,会立刻跳转到 except 语句
    print('程序出错了!!!!')
else:  # 程序运行如果没有出错,会执行else语句里的代码
    print('计算的结果是', x)

重点

12-except语句

# try...except 语句用来处理程序运行过程中的异常
try:
    person = {'name': 'zhangsan'}
    print(person['age'])
    print(1 / 2)
    file = open('ddd.txt')
    print(file.read())
    file.close()
except Exception as e:  # 给异常起了一个变量名 e
    print(e)
# except:
#     print('出错了!!!')
# except (FileNotFoundError, ZeroDivisionError, KeyError) as e:  # 处理指定类型的异常

13-异常的使用场景

age = input('请输入您的年龄:')  # input接收到的用户输入是一个字符串

# if age.isdigit():
try:
    age = float(age)
except ValueError as e:
    print('输入的不是数字')
else:
    if age > 18:
        print('欢迎来到我的网站')
    else:
        print('未满18岁,请自动离开')

常见异常总结

1.SynataxError:语法错误

2.NameError:试图访问的变量名不存在

3.IndexError:索引错误,使用的所以你不存在,常为索引超出序列范围

4.KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误

5.TypeError:类型错误,内建操作或是函数应于在错误类型的对象时会引发类型错误

6.ValueError:值错误,传给对象的参数类型不正确,例如给int()函数传入了字符串数据类型

7.AttributeError:属性错误,特性引用和赋值失败时会引发属性错误

8.IOError:输入输出错误

异常不局限于以上八中,这只是很常见的八种异常

捕获异常

1.try...except组合语法

(1)代码:

try:

  正常的操作

except:

  发生异常,执行这块代码

(2)案例:

2.try...except...else组合语法

(1)代码:

try:

  正常的操作

except:

  发生异常,执行这块代码

else:

  如果没有异常,执行这块代码

(2)案例:

3.try...except...except(多个异常处理)

(1)代码:

try:

  正常的操作

except A:

  发生异常A,执行这块代码

except B:

  发生异常B,执行这块代码

except:

  发生其它异常,执行这块代码

else:

  如果没有异常,执行这块代码

(2)案例:

4.try...except(A,B)(一次捕获多个异常)

(1)代码:

try:

  正常的操作

except(A,B):

  发生异常A和B,执行这块代码

(2)案例:

5.try...except...finally组合语法:(try...finally也可以)

(1)代码:

try:

  正常的操作

except:

  发生异常,执行这块代码

else:

  如果没有异常,执行这块代码

finally:

  不管有没有异常,都执行这块代码

(2)案例:

 

6.try...except(嵌套)

(1)代码:

try:

  正常的操作

  try:

  正常的操作

  finally:

  不管有没有异常,都执行这块代码

except A:

  发生异常,执行这块代码

(2)案例:

.处理异常(在脚本执行不成功时,我们希望能把信息打印出来)

1.如果已经知道会发生什么异常:

 

2.不知道会发生什么异常(万能的)---------所有的异常都继承Exception

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老板来片烤面包

君子博学于文,赠之以礼,谢君~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值