xcq-bj

导航

 

文件

文件操作, 使用代码 来读写文件
1, Game 案例,最高分不能保存的, 可以将最高分保存到文件中,
2, 自动化, 测试数据在文件中保存的, 从文件中读取测试数据,进行自动化代码的执行

文件的介绍

文件: 可以存储在长期存储设备(硬盘, U盘)上的一段数据即为文件

1, 计算机只认识 二进制数据(0 和 1)
2, 所有的文件在计算机中存储的形式都是 二进制即 0 和 1 ,打开文件看到的是文字不是 0 和 1 ,原因是打开文件的
软件会自动的将二进制转换为 文字

文件的分类(根据能否使用文本软件(记事本)打开文件):
- 文本文件
- 二进制文件
  • 文本文件
    • 可以使用记事本软件打开
    • txt, py, md, json
  • 二进制文件
    • 不能使用 记事本软件打开
    • 音频文件 mp3
    • 视频文件 mp4 ....
    • 图片 png, jpg, gif, exe

文件操作的步骤

1. 打开文件
2. 读、写文件
    l, 读 将文件内容读入内存
    2, 写 将内存内容写入文件
3. 关闭文件

打开文件 open()

open(file, mode='r', encoding=None) # 将硬盘中的文件 加载到内存中
- file: 表示要操作的文件的名字,可以使用相对路径 和绝对路径
    - 绝对路径, 从根目录开始书写的路径 C:/ D:/
    - 相对路径, 从当前目录开始书写的路径 ./ ../

- mode: 打开文件的方式
    - r , 只读打开 read, 如果文件不存在,会报错
    - w , 只写打开, write, 如果文件存在, 会覆盖原文件
    - a , 追加打开, append, 在文件的末尾写入新的内容

- encoding: 编码格式, 指 二进制数据 和 汉字 转换的规则的
    - utf-8(常用) : 将一个汉字转换为 3 个字节的二进制	
    - gbk: 将一个汉字转换为 2 个字节的二进制
返回值: 文件对象, 后续对文件的操作, 都需要这个文件对象

关闭文件 close()

文件对象.close() # 关闭文件, 如果是 写文件, 会自动保存, 即将内存中的数据同步到硬盘中

读文件 read()

变量 = 文件对象.read()
返回值: 返回读取到文件内容, 类型是字符串
# f=open("a.txt",encoding="utf-8")       #不写mode,默认’r'
# buf=f.read()
# print(buf)

with open('a.txt','r',encoding='utf-8') as f:
    buf=f.read()
    print(buf)

写文件 write()

文件对象.write()
# 参数: 写入文件的内容, 类型 字符串
# 返回值: 写入文件中的字符数, 字符串的长度, 一般不关注
# 打开文件
f = open('a.txt', 'w', encoding='utf-8')

# 写文件
# f.write("好好学习 \n天天向上")

f.write("第二次写入,覆盖第一次内容")
# 关闭文件
f.close()

文件打开的另一种写法(推荐)

with open(file, mode, encoding) as 变量: # 变量 就是文件对象
pass
# 使用这种写法打开文件, 会自动进行关闭,不用手动书写关闭的代码
# 出了 with 的缩进之后, 文件就会自动关闭
with open('a.txt', 'a', encoding='utf-8') as f:    #a:从a.txt的末尾 追加 内容
	f.write('good good study\n')

按⾏读取⽂件 readline()

⽂件对象.readline() # ⼀次读取⼀⾏的内容, 返回读取到的内容

read() 和 readline() 如果读到⽂件末尾, 返回的都是 空字符串
with open('a.txt', encoding='utf-8') as f:
     buf = f.readline()
     print(buf) # aaaaaa
     buf1 = f.readline()
     print(buf1) # bbbbbb

读取⼤⽂件

# with open('a.txt', encoding='utf-8') as f:
#     while True:
#         buf = f.readline()  # ⽂件读完了,返回 空字符串
#         if buf == "":
#             break
#         else:
#             print(buf, end='')

with open('a.txt', encoding='utf-8') as f:
    while True:
        buf = f.readline()  # ⽂件读完了,返回 空字符串
        if buf:  # 空字符串 是 False, ⾮空字符串 是True
            print(buf, end='')
        else:
            break

打开⽂件的⽅式

r w a 称为是⽂本⽅式打开, 适⽤于 ⽂本⽂件, 会对⼆进制进⾏编码转换

rb wb ab 称为是⼆进制⽅式打开, 可以打开⽂本⽂件和⼆进制⽂件, 但是 ⼆进制⽂件只能使⽤ ⼆进制⽅式打开, 
         同时,不能传递 encoding 参数

DAY-08课堂笔记


json ⽂件

1, json ⽂件的本质也是⽂本⽂件, 就可以直接使⽤ read 和
write 去进⾏操作
2, json ⽂件⽐较特殊, ⽐较像 Python 中的字典和列表
3, json ⽂件使⽤⽐较频繁,按照 read 和 write 的操作,⽐较麻烦,
   专⻔的⽅法来操作 json ⽂件, 可以直接得到 Python 中的列表和字典

介绍:

1, json ⽂件, 是⼀种基于⽂本,独⽴于语⾔的轻量级数据交换格式。
    - 基于⽂本, ⽂本⽂件,不包含 图⽚,视频等
    - 独⽴于语⾔, 不是某⼀种语⾔特有的, Python,Java, C++,
    ....
    - 轻量级, 相同的数据量,json ⽂件的占⽤的⽂件⼤⼩相对较⼩
    - 数据交换格式, 后端服务器 和前端⻚⾯ 交换数据使⽤的格式

2, 在⾃动化测试中经常⽤来存放测试数据,⽂件后缀名为:.json

json 操作

json ⽂件的定义

我叫⼩明,我今年 18 岁,性别男, 学校 空, 爱好 听歌,吃饭,打⾖⾖, 我的居住地址为 国家 中国, 城市 ⼴州.
{
  "name":"小明",
  "age": 18,
  "isMan": true,
  "school": null,
  "like":["听歌","吃饭","打豆豆"],
  "address": {
    "country": "China",
    "city": "广州"
  }
}

读取 json ⽂件

1, 可以直接使⽤ read 去读, 但是 想要取到数据很麻烦
2, 使⽤ 专⻔的⽅法去读
- 1. 导包 import json
- 2. json.load(⽂件对象) ---> 得到的是 列表 或者字典
import json

with open("info", encoding="utf-8") as f:
    buf = json.load(f)
    print(buf)                             # {'name': '小明', 'age': 18, 'isMan': True, 'school': None, 'like': ['听歌', '吃饭', '打豆豆'], 'address': {'country': 'China', 'city': '广州'}}
    print(buf.get('name'))                 # 小明
    print(buf.get('like'))                 # ['听歌', '吃饭', '打豆豆']
    print(buf.get('address').get("city"))  # 广州
    print(buf.get('like')[2])              # 打豆豆

练习

我叫⼩明,我今年 18 岁,性别男, 爱好 听歌, 吃饭,打⾖⾖,
我的居住地址为 国家中国, 城市⼴州. ---> 对象

我叫⼩红,我今年 17 岁,性别⼥, 爱好 听歌, 学习,购物
我的居住地址为 国家 中国, 城市北京. ---> 对象
-----
获取 每个⼈的姓名, 年龄 性别, 城市

json文件:

[
  {
    "name": "小明",
    "age": 18,
    "isMan": true,
    "like": [
      "听歌",
      "吃饭",
      "打豆豆"
    ],
    "address": {
      "country": "China",
      "city": "广州"
    }
  },
  {
    "name": "小红",
    "age": 17,
    "isMan": false,
    "like": [
      "听歌",
      "学习",
      "购物"
    ],
    "address": {
      "country": "China",
      "city": "北京"
    }
  }
]
import json

with open("info2.json", encoding="utf-8") as f:
    buf = json.load(f)  # 列表
    for i in buf:
        if i.get("isMan"):
            sex="男"
        else:
            sex="女"
        print(f"name:{i.get('name')},age:{i.get('age')},sex:{sex},city:{i.get('address').get('city')}")

写⼊(了解)

将 Python 中列表或者字典 转换为 json ⽂件
导包 import json
使⽤ json.dump(Python中数据, ⽂件对象)
import json

info = {'name': '⼩明', 'age': 18}
with open('info3.json', 'w', encoding='utf-8') as f:
    # json.dump(info, f)

    # json.dump(info, f, ensure_ascii=False) # 直接显示中⽂

    json.dump(info, f, ensure_ascii=False, indent=2)  # 直接显示中⽂,并且缩进

dump参数:

  • ensure_ascii参数用于控制非ASCII字符的处理方式;<1>
  • indent参数用于定义生成的JSON字符串或文件的缩进级别,使得输出更易于阅读;<2>
  • separators参数允许指定分隔符;
  • sort_keys参数可以指定是否对字典的键进行排序;
  • defaultcls参数提供了自定义序列化的方式

异常

介绍

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

2, 程序停⽌执⾏并且提示错误信息这个动作, 通常称之为: 抛出(raise) 异常
异常类型: 错误描述信息
FileNotFoundError: [Errno 2] No such file ordirectory: 'aaaa.txt'
ZeroDivisionError: division by zero
ValueError: invalid literal for int() with base 10:'78.1'

捕获异常

1, 程序代码在执⾏的时候, 如果遇到异常, 程序就会终⽌,不会继续执⾏
2, 需求: 程序遇到异常之后, 不会结束,可以继续执⾏,
3, 实现需求: 就需要使⽤ 异常捕获
try:
     可能发⽣异常的代码
except: # 可以捕获任意类型的异常
     发⽣了异常执⾏的代码
# 1. 获取⽤户从键盘输⼊的数据
num = input('请输⼊数字:')
try:
     # 2. 转换数据类型为整数
     num = int(num)
     # 3. 数据转换类型正确时, 输出数据内容
     print(num)
except:
     # 4. 数据转换类型错误时, 提示输⼊正确数据
     print('请输⼊正确的数字')

捕获指定类型的异常

发⽣的异常可能存在多种, 针对不同类型的异常, 解决处理的⽅案不⼀样
try:
      可能发⽣异常的代码
except 异常类型1:
      发了异常类型1,执⾏的代码
except 异常类型2:
      发了异常类型2,执⾏的代码
except .....:
      pass
try:
    num = int(input('请输⼊⼀个整数数字:'))
    num1 = 8 / num
    print(num1)
except ValueError:  #
    print('输⼊的内容⾮数字,请重新输⼊')
except ZeroDivisionError:
    print('不能输出数字 0, 请重新输⼊')

捕获未知类型的异常(使⽤最多)

try:
  可能发⽣异常的代码
except Exception as 变量: # Exception 常⻅异常类的⽗类, 变量 异常对象,print()可以打印异常信息
  发⽣异常执⾏的代码
try:
    num = int(input('请输⼊⼀个整数数字:'))
    num1 = 8 / num
    print(num1)
except Exception as e:
    print(f'发⽣了异常, {e}')

异常捕获的完整结构

try:
    可能发⽣异常的代码
except 异常类型:
    发⽣了指定类型的异常执⾏的代码
except Exception as e:
    发⽣了其他类型的异常执⾏的代码
else:
    没有发⽣异常, 会执⾏的代码
finally:
    不管有没有发⽣异常, 都会执⾏的代码

案例

需求:
1. 获取用户输入的数字
2. 判断获取的数字是否整数
3. 如果不是整数, 提示输入错误
4. 如果是整数, 则进一步判断是奇数还是偶数
5. 最终提示: 程序运行结束

# ⽅案⼀
使⽤异常捕获
# ⽅案⼆
if 判断
字符串.isdigit() 判断数字是否是纯数字,是 纯数字,返回
True,不是返回 False
# 1. 获取⽤户输⼊的数字
num = input('请输⼊数字:')
try:
    # 2. 判断获取的数字是否整数
    num = int(num)  # 没有发⽣异常, 说明是整数,如果发⽣异常,说明不是整数
except Exception as e:
    # 3. 如果不是整数, 提示输⼊错误
    print("输⼊错误", e)
else:
    # 4. 如果是整数, 则进⼀步判断是奇数还是偶数
    if num % 2 == 0:
        print('偶数')
    else:
        print('奇数')
# 5. 最终提示: 程序运⾏结束
finally:
    print('程序运⾏结束')
# 1. 获取⽤户输⼊的数字
num = input('请输⼊数字:')
# 2. 判断获取的数字是否整数
if num.isdigit():
    # 如果是 True, 表示是整数
    # 类型转换
    num = int(num)
    # 4. 如果是整数, 则进⼀步判断是奇数还是偶数
    if num % 2 == 0:
        print('偶数')
    else:
        print('奇数')
# 3. 如果不是整数, 提示输⼊错误
else:
    print('输⼊错误')
# 5. 最终提示: 程序运⾏结束
print('程序运⾏结束')

.isdigit():判断数字是否是纯数字,是 纯数字,返回

"10".isdigit()
-True
"11.5".isdigit()
-False
"aaa".isdigit()
-False

异常传递

1, 异常传递 是 Python 中已经实现好的功能, 不需要我们写代码实现
2, 异常传递是指, 在函数的嵌套调⽤过程中,如果发⽣了异常,没有进⾏捕获,会将这个异常传递到函数调⽤的地⽅, 直到被捕获为⽌, 如果⼀直没有捕获,才会报错,终⽌执⾏

抛出异常

1, 在执⾏代码的过程中,之所以会发⽣异常,终⽌代码执⾏,是因为 代码执⾏ 遇到了 raise 关键字
2, raise 关键字的作⽤, 就是来抛出异常,让代码终⽌执⾏
3, 应⽤场景: ⾃⼰书写代码模块,让别⼈使⽤,为了让别⼈按照你的规定使⽤你的代码,你就可以在他不满⾜你条件的情况下,使⽤raise 抛出异常
posted on 2024-07-29 19:13  xcq_cm  阅读(31)  评论(0)    收藏  举报