Learning Diary for Python - 14
一、文件操作基础
"""
1)背景:程序中数据默认保存在运行内存中的,保存在运行内存中的数据在程序运行结束后会被销毁。
如果程序中的数据在程序结束后不销毁必须将数据通过文件的形式保存到磁盘中。
2)数据持久化又叫数据本地化,就是将程序中的数据存储到文件中的过程。
3)常见的数据持久化工具:数据库(.db、.sqlite)、json文件、plist文件、csv文件、excel文件、txt文件等
"""
# 2. 文件操作 - 操作的是文件内容
"""
基本操作基本流程:打开文件 -> 操作文件(读、写) -> 关闭文件
"""
# 2.1 打开文件
"""
open(file, mode='r', *, encoding=None) - 以指定的方式打开指定文件,并且返回一个文件对象
1)file - 需要打开的文件的路径(可以是绝对路径,也可以是相对路径)
注意:相对路径如果是'./'开头,'./'可以省略
2)mode - 文件打开方式;由两组值来决定打开文件后能干什么,操作文件的时候数据的类型是什么类型
第一组(决定能干什么): r、w、a
r - 只读,如果文件不存会报错
w - 只写,会清空原文件内容,如果文件不存在会自动创建文件
a - 只写,不会清空原文件内容,如果文件不存在会自动创建文件
+ - 读写,使用方法:r+、a+、w+
第二组(决定数据类型): t、b
t - 字符串
b - 字节(二进制数据)
打开文本文件可以用t也可以用b;二进制文件只能用b打开。
使用的时候必须在每一组值中选一个,如果第二组值没选,相当于选的't',
例如:'rt'、'r'、'rb'、'br', 'wt'、'bw'、'ba'、'a'等
3)encoding - 文件编码方式(文本文件文字存储的时候采用的字符集);
只有在以t方式打开文件的时候才需要设置encoding
一般赋值为: utf-8
'utf-8' -> 数字、字母使用1字节;中文采用3个字节;😁表情符号采用4个字节
'gbk' -> 中文采用4个字节
"""
# ==========./可以省略===========
# open('./files/test1.txt')
# open('files/test1.txt')
# =========r - 只读=============
# f = open('files/test1.txt', 'r')
# f.read()
# f.write('abc') # 报错! io.UnsupportedOperation: not writable
# =======a - 只写,不会清空原文件=======
# f = open('files/test1.txt', 'a')
# f.write('xxx')
# f.read() # 报错!io.UnsupportedOperation: not readable
# ======== w - 只写,会清空原文件 ==========
# f = open('files/test1.txt', 'w')
# f.write('xxx')
# f.read() # 报错!io.UnsupportedOperation: not readable
# ======= 读的方式打开不存在的文件会报错 ==========
# open('files/test100.txt', 'r') # 报错! FileNotFoundError
# ====== 写的方式打开不存在的文件不会报错,并且会自动创建这个文件 ======
# open('files/test2.txt', 'w')
# open('files/test3.txt', 'a')
# ============== + 可以变读写 ============
# f = open('files/test2.txt', 'w+')
# f.read()
# f.write('300')
# =============== t 读写数据类型是字符串 ==========
# f = open('files/test1.txt', 'rt')
# result = f.read()
# print(type(result)) # <class 'str'>
# f = open('files/test1.txt', 'wt')
# f.write('abc')
# f.write(200) # TypeError: write() argument must be str, not int
# =============== b 读写数据类型是字节(二进制) ==========
# f = open('files/test1.txt', 'rb')
# result = f.read()
# print(type(result)) # <class 'bytes'>
# ========== 文本文件既可以用t打开,也可以用b打开
# f = open('files/test1.txt', 'rt')
# result = f.read()
# print(type(result)) # <class 'str'>
# f = open('files/test1.txt', 'rb')
# result = f.read()
# print(type(result)) # <class 'bytes'>
# ============= 二进制文件(图片、视频、音频、pdf等)只能用b打开 ===========
# f = open('files/luffy.jpg', 'rt')
# result = f.read() # 报错! UnicodeDecodeError
# f = open('files/luffy.jpg', 'rb')
# result = f.read()
# students = ['小明', '小红', '小花']
# f = open('files/students.txt', 'w')
# f.write(str(students))
# 2.2 操作文件
"""
1) 读操作:
文件对象.read() - 从读写位置开始读到文件结束(获取整个文件内容),返回值就是文件内容
文件对象.readline() - 从读写位置开始读到一行结束
"""
# f = open('files/test1.txt', encoding='utf-8')
# result = f.read()
# print(result)
# print('===================================')
# f.seek(0) # 将读写位置移动到文件开头
# result = f.read()
# print(result)
# print('===================================')
# f.seek(0)
# result = f.readline()
# print(result)
# result = f.readline()
# print(result)
"""
2) 写操作
文件对象.write(数据) - 将指定的数据写入指定文件
"""
# try:
# f = open('files/test1.txt', 'w', encoding='utf-8')
# except:
# f = open('files/test1.txt', 'w')
#
# f.write('ABC那是')
# f.close()
# 2.3 关闭文件
# 文件操作完后要关闭文件: 文件对象.close
# f.write('按计划代发') # 报错! ValueError: I/O operation on closed file.
# 防止忘记关闭文件的方法1:
result = open('files/test1.txt').read()
print(result)
# 防止忘记关闭文件的方法2:
with open('files/test1.txt') as f:
result = f.read()
print(result)
# print(f.read())
二、数据持久化
# 1. 数据持久
"""
第一步:确定需要持久化的数据
第二步:创建文件并且确定文件初识内容
第三步:这程序中需要这个数据的时候从文件中读这个数据
第四步:当这个数据发生改变以后需要将最新的数据写入文件中
"""
# 练习1:写程序打印程序执行次数
try:
count = int(open('files/count.txt', encoding='utf-8').read())
except FileNotFoundError:
count = 0
count += 1
print(count)
open('files/count.txt', 'w', encoding='utf-8').write(str(count))
# 练习2:写程序添加学生,并且打印已经添加过的所有学生
"""
第1次运行程序:
请输入学生姓名: 小明
小明
第2次运行程序:
请输入学生姓名: 小花
小明 小花
第3次运行程序:
请输入学生姓名: 小红
小明 小花 小红
....
"""
# name = input('请输入学生姓名:')
# open('files/names.txt', 'a', encoding='utf-8').write(f'{name} ')
# result = open('files/names.txt', 'r', encoding='utf-8').read()
# print(result)
# 练习3:写程序添加学生,并且打印已经添加过的所有学生
"""
第1次运行程序:
请输入学生姓名: 小明
[小明]
第2次运行程序:
请输入学生姓名: 小花
[小明, 小花]
第3次运行程序:
请输入学生姓名: 小红
[小明, 小花, 小红]
....
"""
def demo3():
name = input('请输入学生姓名:') # name = '小明' name = '小花'
# 获取文件中保存的列表
try:
all_students = eval(open('files/studentInfo1.txt', encoding='utf-8').read())
# eval("['小明']") -> all_students = ['小明']
except FileNotFoundError:
all_students = []
# 在列表中添加新的名字
all_students.append(name) # ['小明'], ['小明', '小花']
print(all_students) # ['小明'] ['小明', '小花']
# 将改变后的列表写入文件
open('files/studentInfo1.txt', 'w', encoding='utf-8').write(str(all_students)) # "['小明']"
print(len(all_students), all_students[0])
# demo3()
# 练习4:写程序添加学生,并且打印已经添加过的所有学生
"""
请输入学生姓名: 小明
请输入学生电话: 110
请输入学生专业: 电子信息
[
{'name': '小明', 'tel': '110', 'major': '电子信息'}
]
请输入学生姓名: 小花
请输入学生电话: 119
请输入学生专业: 服装设计
[
{'name': '小明', 'tel': '110', 'major': '电子信息'},
{'name': '小花', 'tel': '119', 'major': '服装设计'}
]
"""
def demo4():
# 1. 输入学生信息
name = input('请输入学生姓名:')
tel = input('请输入学生电话:')
major = input('请输入学生专业:')
# 2. 获取之前已经添加过的所有学生
try:
all_student = eval(open('files/studentInfo2.txt', encoding='utf-8').read())
except FileNotFoundError:
all_student = []
# 3. 添加学生
all_student.append({'name': name, 'tel': tel, 'major': major})
print(all_student)
# 4. 更新文件
open('files/studentInfo2.txt', 'w', encoding='utf-8').write(str(all_student))
print('学生人数:', len(all_student))
for stu in all_student:
print(stu['major'])
demo4()