IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 23_Python_文件和异常 -> 正文阅读

[Python知识库]23_Python_文件和异常

文件和异常

目标

  • 文件操作
    1、普通文件的操作
    2、json文件的操作(重点)
  • 异常处理(程序代码运行时的报错)

文件介绍

计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据
作用: 将数据长期保存下来,在需要的时候使用
?
1.计算机只认识 二进制(0 1)
2.文件中存储的数据都是以二进制(0 1) 的形式去存储的
?
可以根据 文件中的二进制内容,能否使用记事本软件 将其转换为文字, 
将文件分为两种: 文本文件和二进制文件
  • 文本文件
    能够使用记事本软件打开(能够使用记事本转换为文字)
    xt, md, py , html, css, js , json
  • 二进制文件
    不能使用记事本软件打开的
    exe, mp3, mp4, jpg, png

我们操作的基本都是文本文件

文件操作

文件操作的步骤

1.打开文件
2.读或者写文件
3.关闭文件

1、打开文件

打开文件: 将文件从磁盘(硬盘) 中 读取到内存中
语法:
open(file, mode=‘r’, encoding=None)
参数 file: 是要打开的文件, 类型是字符串, 文件的路径可以是相对路径,也可以是绝对路径(从根目录开始书写的路径),建议使用相对路径(相对于当前代码文件所在的路径, ./ …/ )
参数 mode: 默认参数(缺省参数), 表示的是打开文件的方式
r: read 只读打开
w: write 只写打开
a: append 追加打开, 在文件的末尾写入内容
参数 encoding: 编码方式,(文字和二进制如何进行转换的)
gbk: 将一个汉字转换为 2 个字节二进制
utf-8: 常用, 将一个汉字转换为 3 个字节的二进制
返回值: 返回的是 文件对象, 后续对文件的操作,都需要这个对象

2、读或者写文件

写文件

向文件中写入指定的内容。
前提: 文件的打开方式是 w 或者 a

文件对象.write('写入文件的内容')
# 返回值: 写入文件的字符数,一般不关注
# 注意 w 方式打开文件:
1. 文件不存在,会直接创建文件
2. 文件存在,会覆盖原文件(将原文件中的内容清空)

# 1, 打开文件
f = open('a.txt', 'w', encoding='utf-8')
# 2, 写文件
f.write('好好学习\n')
f.write('天天向上')
# 3, 关闭文件
f.close()

读文件

将文件中的内容读取出来
前提: 文件的打开方式需要是 r 
文件对象.read(n)
# 参数 n 表示读取多少个字符, 一般不写,表示读取全部内容
# 返回值: 读取到的文件内容, 类型 字符串


# 1, 打开文件
f = open('a.txt', 'r', encoding='utf-8')
# 2, 读文件
buf = f.read()
print(buf)  # 目前只是打印读取的内容,可以做其它的事
# 3. 关闭文件
f.close()
?
# r 方式打开文件 ,如果文件不存在,代码会报错

3、关闭文件

关闭文件: 将文件占用的资源进行清理,同时会保存文件, 文件关闭之后,这个文件对象就不能使用了
文件对象.close()

使用with open打开文件

with open() 打开文件的好处: 不用自己去书写关闭文件的代码, 会自动进行关闭


with open(file, mode, encoding='utf-8') as 变量:
    # 在缩进中去读取或者写入文件
?
# 缩进中的代码执行结束, 出缩进之后, 文件会自动关闭 

with open('a.txt', 'a', encoding='utf-8') as f:
    f.write('good good study ')
?
?
# a 方式打开文件, 文件不存在会创建文件, 文件存在, 在文件的末尾写入内容


按行读取文件内容

按行读取文件:一次读取一行内容
文件对象.readline()

# with open('b.txt', encoding='utf-8') as f:
#     buf = f.readline()  # 111
#     print(buf)
#     print(f.readline())  # 222
?
?
# with open('b.txt', encoding='utf-8') as f:
#     for i in f:  # 按行读取, 读到文件末尾结束
#         print(i, end='')
?
?
# read() 和 readline() 读到文件末尾, 返回一个空字符串, 即长度为 0
?
with open('b.txt', encoding='utf-8') as f:
    while True:
        buf = f.readline()
        if len(buf) == 0:
            break
        else:
            print(buf, end='')
?
?
# 在容器中 , 容器为空,即容器中的数据的个数为 0 ,表示 False, 其余情况都是 True
with open('b.txt', encoding='utf-8') as f:
    while True:
        buf = f.readline()
        if buf:  # if len(buf) != 0
            print(buf)
        else:
            break

json文件的处理

json ?件 也是?个?本?件, 就可以直接使? read() 和write() ?法 去操作?件, 只是使?这两个?法,不?便,所以对 json ?件有??独特的读取和写?的?法

常?在做测试的时候, 将测试数据定义为 json ?件格式,使?代码读取 json?件,即读取测试数据, 进?传参(参数化)

json的介绍

json 基于?本,独?于语?的轻量级的数据交换格式

  • 基于?本, 是?个?本?件, 不能包含图?,?视频等
  • 独?于语?, 不是某个语?特有的, 每种编程语?都可以使?
  • 轻量级, 相同的数据, 和其他格式相?,占?的???较?
  • 数据交换格式, 后端程序员 给前端的数据 (json,htmlxml)

json文件的语法

  1. json ?件的后缀是 .json
  2. json 中主要数据类型为 对象({} 类似 Python 中 字典)和 数组([], 类似 Python 中的列表), 对象和数组可以互相嵌套
  3. ?个json ?件是?个对象或者数组(即 json ?件的最外层要么是?个 {}, 要么是?个 数组 [])
  4. json 中的对象是由键值对组成的, 每个数据之间使? 逗号隔开,但是最后?个数据后边不要写逗号
  5. json 中的字符串 必须使? 双引号
  6. json 中的其他数据类型
    数字类型 ----> int float
    字符串 string —> str
    布尔类型 true, false -----> True, False
    空类型 null —> None

json文件的书写

我叫?明,我今年 18 岁,性别男, 
爱好 听歌, 游戏,购物,吃饭,睡觉,打??,
我的居住地址为 国家中国, 城市上海
{
	"name": "小明",
	"age": 18,
	"isMen": true,
	"like": [
		"听歌",
		"游戏",
		"购物",
		"吃饭",
		"睡觉",
		"打??"
	],
	"address": {
	"country": "中国",
	"city": "上海"
	}
}

读取json文件

1. 导包 import json
2. 读打开?件
3. 读?件
json.load(?件对象)

# 返回的是 字典(?件中是对象)或者列表(?件中的数组)
# 1, 导? json
import json
# 2, 读打开?件
with open('info.json', encoding='utf-8') as f:
# 3. 读取?件
# buf = f.read()
# print(type(buf), buf)
result = json.load(f)
print(type(result)) # <class 'dict'>
# 姓名
print(result.get('name'))
# 年龄
print(result.get('age'))
# 城市
print(result.get('address').get('city'))

练习

我叫?明,我今年 18 岁,性别男, 爱好 听歌, 游戏,吃饭,睡觉,
打??,
我的居住地址为 国家中国, 城市上海.
我叫?红,我今年 17 岁,性别?, 爱好 听歌, 学习,购物
我的居住地址为 国家 中国, 城市北京.
[
  {
    "name": "小明",
    "age": 18,
    "isMen": true,
    "like": [
      "听歌",
      "游戏",
      "购物",
      "吃饭",
      "睡觉",
      "打豆豆"
    ],
    "address": {
      "country": "中国",
      "city": "上海"
    }
  },
  {
    "name": "小红",
    "age": 17,
    "isMen": false,
    "like": [
      "听歌",
      "购物",
      "学习"
    ],
    "address": {
      "country": "中国",
      "city": "北京"
    }
  }
]
  • 代码文件
import json

with open('info2.json', encoding='utf-8') as f:
    info_list = json.load(f)
    for info in info_list:
        print(info.get('name'), info.get('age'), info.get('address').get('city'))

结果显示:
小明 18 上海
小红 17 北京

练习2

某?站的测试数据如下 data.json, 需求,提取 json ?件中的
?户名,密码和预期结果, 组成如下格式: [(), (), ()] (?
动化参数化需要的数据格式)
[
   {
      "desc": "正确的用户名密码",
      "username": "admin",
      "password": "123456",
      "expect": "登录成功"
    },
    {
      "desc": "错误的用户名",
      "username": "root",
      "password": "123456",
      "expect": "登录失败"
    },
    {
      "desc": "错误的密码",
      "username": "admin",
      "password": "123123",
      "expect": "登录失败"
    }
]
import json


def read_data():
    new_list = []
    with open('info3.json', encoding='utf-8') as f:
        data = json.load(f)  # 列表
        # print(data)
        for i in data:  # i 字典
            # print((i.get('username'), i.get('password'), i.get('expect')))
            new_list.append((i.get('username'), i.get('password'), i.get('expect')))

        # print(new_list)
    return new_list

print(read_data())

结果显示:
[('admin', '123456', '登录成功'), ('root', '123456', '登录失败'), ('admin', '123123', '登录失败')]

json的写入

?件对象.write(字符串) 不能直接将 Python 的列表 和字典
作为参数传递
想要将 Python 中的数据类型存为 json ?件, 需要使? json
提供的?法, 不再使? write
步骤:
1. 导包 import json
2. 写(w) ?式打开?件
3. 写?
json.dump(Python 中的数据类型, ?件对象)
import json

my_list = [('admin', '123456', '登录成功'), ('root', '123456', '登录失败'), ('admin', '123123', '登录失败')]

with open('info4.json', 'w', encoding='utf-8') as f:
    # json.dump(my_list, f)
    # json.dump(my_list, f, ensure_ascii=False)  # 直接显示中文,不以 ASCII 的方式显示
    # 显示缩进
    # json.dump(my_list, f, ensure_ascii=False, indent=2)
    json.dump(my_list, f, ensure_ascii=False, indent=4)

异常

程序在运?时,如果 Python 解释器 遇到到?个错误,会停?程序的执?,并且提示?些错误信息,这就是异常

程序停?执?并且提示错误信息 这个动作, 抛出异常(raise 关键字)

捕获异常: 程序遇到异常, 默认动作是终?代码程序的执?, ?异常之后, 可以使? 异常捕获, 让程序代码继续运?,不会终?运?(重点)

异常捕获[重点]

基本语法

try:
	书写可能发?异常的代码
except: # 任何类型的异常都能捕获
	发?了异常执?的代码


try:
	书写可能发?异常的代码
except 异常类型: # 只能捕获指定类型的异常, 如果不是这个异常,还是会报错
	发?了异常执?的代码

try:
	# 1. 获取?户从键盘输?的数据
	num = input('请输?数字:')
	# 2. 转换数据类型为整数
	num = int(num)
	# 3. 输出转换之后的数据内容
	print(num)
except:
	print('请输?正确的数字')

print('后续其他的代码,可以继续执?')


try:
	# 1. 获取?户从键盘输?的数据
	num = input('请输?数字:')
	# 2. 转换数据类型为整数
	num = int(num)
	# 3. 输出转换之后的数据内容
	print(num)
except ValueError: # 只能捕获 ValueError 类型及其?类的异常
	print('发生了异常,请输入正确的数字...')

捕获多个指定类型的异常

好处:可以针对不同的异常错误,进行单独的代码处理
try:
    # 1. 获取用户从键盘输入的数据
    num = input('请输入数字:')
    # 2. 转换数据类型为整数
    num = int(num)
    # 3. 输出转换之后的数据内容
    print(num)
    a = 10 / num   # 10 / 0
    print(f'a: {a}')

except ValueError:  # 只能捕获 ValueError 类型及其子类的异常
    print('发生了异常, 请输入正确的数字...')
except ZeroDivisionError:
    print('除数不能为 0')

异常捕获的完整版本

完整版本中的内容,不是说没一说每一次都要进行全部书写,根据自己的需要,去选择其中的进行使用
try:
	可能发?异常的代码
except 异常类型1:
	发?异常类型1执?的代码
# Exception 是常?异常类的?类, 这?书写 Exception,可以捕获常?的所有?会, as 变量, 这个变量是?个异常类的对象, print(变量) 可以打印异常信息
except Exception as 变量:
	发?其他类型的异常,执?的代码
else:
	没有发?异常会执?的代码
finally:
	不管有没有发?异常,都会执?的代码

try:
	可能发?异常的代码
except Exception as e:
	发?异常执?的代码




try:
    # 1. 获取用户从键盘输入的数据
    num = input('请输入数字:')
    # 2. 转换数据类型为整数
    num = int(num)
    # 3. 输出转换之后的数据内容
    print(num)
    a = 10 / num   # 10 / 0
    print(f'a: {a}')

except Exception as e:
    print(f"错误信息为: {e}")
else:
    print('没有发生异常我会执行')
finally:
    print('不管有没有发生异常,我都会执行')
# print('不管有没有发生异常,我都会执行')
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:36:48  更:2022-04-18 17:38:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:56:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码