# import test
# print(test.a)
# from test import a
# print(a)
# from test import *
# import test as ts
# from test import a as A
# import modes
# print(modes.b)
# import modes.test1 as test1
# print(test1.name)
# from modes import test1
# print(test1.name)
# from modes.test1 import name
# print(name)
if __name__ == '__main__':
pass
try:
需要捕获异常的代码
except 异常类型:
捕获到异常后需要执行代码
else:
代码没有出现异常会执行的
finally:
无论发生什么状况都会执行的代码
raise 异常类型
class AgeError(Exception):
def __str__(self):
return '年龄值错误!'
程序中的数据默认是保存在运行内存中的;保存在运行内存中的数据在程序运行结束后会自动销毁。 - 导致:这次运行程序产生的数据在下一次运行程序的时候无法使用
如果将数据保存在磁盘中,除了认为删除或者磁盘损坏,数据会一直存在(磁盘是以文件为单位保存数据的)
数据持久化就是指将数据以文件的形式保存到磁盘中。
常见的数据持久化工具:数据库文件(.db、.sqlite)、json文件(.json)、excel文件、csv文件、txt文件、plist文件等
文件操作基本流程:打开文件 -> 操作文件(读、写) -> 关闭文件
open(file, mode=‘r’, *, encoding=None) - 以指定的方式打开指定文件返回一个文件对象
文件路径(文件在计算机中的位置)
a.绝对路径:文件在计算机中的全路径(windows从盘开始写)
b.相对路径(必须将需要打开的文件放在工程目录):
1. 写路径的时候用.表示当前目录(当前目录指的是当前代码文件所在的文件夹)
2. 写路径的时候用..表示当前目录的上层目录
绝对路径
path = r'/Users/yuting/Work/授课/Python2205/02Python语言基础/day15-文件操作/files/test.txt'
open(path)
相对路径
path = './files/test.txt'
open(path)
path = '../day15-文件操作/files/test.txt'
open(path)
文件打开方式(决定打开文件后是能读还是能写?决定打开文件后操作文件的时候对应的数据的类型是字符串还是二进制?)
1. 第一组值(决定读写方式)
r - 只读
w - 只写; 打开的时候会清空原文件内容
a - 只写; 打开的时候不会清空原文件内容
注意:如果文件不存在,以读的方式打开会报错,以写的方式打开不但不报错还会自动创建这个文件。
2. 第二组值(决定数据类型的)
t(默认) - 字符串类型
b - 二进制类型
给mode赋值的是必须在两组值中每组值选择一个选项: ‘rt’、‘tr’、‘r’、‘wt’、‘tw’、‘w’、‘rb’、‘br’、…
注意:打开文件文件可是使用t也可以用b(一般使用t),但是二进制文件(图片、视频、音频等)只能用b打开
# =====r只读=======
# f = open('./files/test.txt', 'rt')
# f.read()
# # f.write('abc') # 报错
# =====w只写并且会清空原文件====
# f = open('./files/test.txt', 'w')
# f.write('123')
# # f.read() # 报错!
# =====a只写并且不会清空原文件====
# f = open('./files/test.txt', 'a')
# f.write('123')
# # f.read() # 报错!
# ======t对应的是字符串=====
f = open('./files/test.txt', 'rt')
result = f.read()
print(type(result)) #
# ======b对应的是二进制=====
f = open('./files/test.txt', 'rb')
result = f.read()
print(type(result)) #
文本文件编码方式(只有在以t方式打开文件的时候才需要设置encoding)
不同的文本文件编码方式保存同一个字符的时候采用内存大小可能不一样
encoding最常见的两种值:
1. utf-8: 一个中文字符用3个字节,英文字符是1个字节
2. gbk: 一个中文字符用2个字节,英文字符是1个字节
使用原则:数据写入文件采用的编码方式要和读文件数据对应的编码方式一致
f = open('./files/a.txt', 'w', encoding='gbk')
f.write('你好!')
f = open('files/a.txt', 'r', encoding='gbk')
print(f.read())
文件对象.read() - 从读写位置开始读到文件结束(获取整个文件的内容)
文件对象.readline() - 从读写位置开始到一行结束(只能用于文本文件)
文件对象.readlines()
f = open('files/test.txt', 'r', encoding='utf-8')
result = f.read()
print(result)
print('------------------')
将读写位置移动到文件开头
f.seek(0)
result = f.read()
print(result)
print('------------------')
f.seek(0)
print(f.readline()) # '床前明月光,\n'
print(f.readline())
print(f.readline())
print(f.readline())
print('------------------')
print(f.readline()) # ''
练习:一行一行的读文件内容,直到读完为止。
f.seek(0)
print('------------------')
while True:
result = f.readline()
if not result:
break
print(result)
print('------------------')
f.seek(0)
print(f.readlines())
print('------------------------------------------华丽的分割线------------------------------------------------')
def read_file():
f = open('files/test.txt', 'r', encoding='utf-8')
while True:
result = f.readline()
if not result:
break
yield result
g = read_file()
print(next(g))
文件对象.write(数据)
f = open('files/test.txt', 'a', encoding='utf-8')
f.write('hello world!')
# 文件对象.close()
f.close()
# f.write('abc')
案例1:添加学生
请输入学生的名字: 小明
小明
请输入学生的名字: 小花
小明 小花
…
# name = input('请输入学生的名字:')
#
# f = open('files/students.txt', 'a', encoding='utf-8')
# f.write(name + ' ')
# f.close()
#
# f = open('files/students.txt', encoding='utf-8')
# print(f.read())
# f.close()
总结:数据持久化步骤:
第一步:确定持久化对象
第二步:创建文件并且确定文件的初始内容(确定存储策略)
第三步:做到在程序中需要这个被持久化的数据的时候从文件中读数据;数据如果发生改变要将最新的数据写入到文件中
案例2:写程序打印程序运行次数
f = open('files/count.txt', encoding='utf-8')
count = int(f.read())
f.close()
count += 1
print(count)
f = open('files/count.txt', 'w', encoding='utf-8')
f.write(str(count))
f.close()
# str(100) -> '100'
# eval('100') -> 100
# str([10, 20, 30]) -> '[10, 20, 30]'
# eval('[10, 20, 30]') -> [10, 20, 30]
result = eval('100')
print(result, type(result))
result = eval('[10, 20, 30]')
print(result, type(result))
result = eval('{"a": 10, 10: 20, "b": 30}')
print(result, type(result))
本质:就是去掉字符串的引号获取引号中表达式的结果
result = eval('100 + 200')
print(result) # 300
x = 100
result = eval('x * 2')
print(result)
x = 'abc'
result = eval('x[-1]')
print(result)
练习:添加学生的名字
请输入学生的姓名: 小明
[‘小明’]
请输入学生的姓名: 小花
[‘小明’, ‘小花’]
…
name = input('请输入姓名:')
# f = open('files/students2.txt', encoding='utf-8')
# all_student = eval(f.read()) # type: list
# f.close()
try:
f = open('files/students2.txt', encoding='utf-8')
except FileNotFoundError:
all_student = []
else:
all_student = eval(f.read())
f.close()
all_student.append(name)
print(all_student)
f = open('files/students2.txt', 'w', encoding='utf-8')
f.write(str(all_student))