day13 -文件操作

day13 -文件操作

一.文件操作

1.数据持久化

计算机内存分为两种:运行内存,硬盘(磁盘)
保存在运行内存中的数据在程序运行结束会自动销毁,保存在硬盘中的数据除非人为删除或者硬盘损坏,否则一直存在
程序中数据默认是保存在运行内存之内

数据持久化就是将数据以文件的形式保存到硬盘中.(保存到硬盘中的数据才能做到,这次运行程序产生的数据下次运行程序还能用)

2.文件操作 - 打开文件后,操作文件中的内容

文件操作基本流程:打开文件 ——> 操作文件(读操作和写操作) - 关闭文件

2.1.打开文件

open(file,mode=‘r’,*,encoding=None) - 以指定的方式打开指定文件,并返回文件

1.file - 需要打开的文件的路径(文件地址)
1)绝对路径 - 文件在计算机中的全路径(windows电脑从盘名开始写)
2)相对路径 - a.写路径的时候用.开头表示当前目录(当前目录指的是当前代码文件所在的文件夹)
b.写路径的时候用…开头表示当前目录的上层目录
2.mode - 文件打开方式,决定打开文件后是能读还是能写,同时决定操作文件的时候数据的类型是字符串还是二进制
两个作用对应的两种值:
1)第一组:决定打开后的读写方式——是读还是写
r - 只读(默认);如果文件不存在会报错
w - 只写:打开文件会先清空原文件——删光重写;如果文件不存在不会报错并且会自动创建文件
a - 只写:打开文件的时候不会清空原文件——在后面添加;如果文件不存在不会报错并且会自动创建文件
1)第二组:决定操作文件的时候数据的类型(str,bytes)
t(默认) - 字符串类型(操作文件的时候涉及到的数据必须是字符串) - 打开文本文件
b - 二进制类型(bytes) —— 二进制文件(图片,视频,音频,pdf等)只能用b
注意:给mode赋值的时候必须在两组中每组选择一个值,顺序不影响
3.encoding — 文本编码方式(只有以t的方式打开文件的时候才考虑给encoding赋值)
不同的文本编码方式决定字符编码在保存的时候采用的字节(大小)
1)常用的文本编码方式:
gbk:英文符号单字节,中文符号双字节
utf-8:英文符号单字节,中文符号三字节
2)使用原则:
不同的时候操作同一个文件采用的编码方式必须一致——否则乱码

1.文件路径

使用绝对路径-运行程序,没有报错表示没问题

open(r'D:\千峰学习文件\自己的代码\01语言基础\day13-文件操作\files\data.txt')

使用相对路径——如果是.\为开头的,.\可以省略,没有报错表示没问题

open(r'.\files\data.txt')

如果是.\为开头的,.\可以省略

open(r'files\data.txt')
open('doudizhu.py')

写路径的时候用…开头表示当前目录的上层目录(包含关系)

open(r'..\day13-文件操作\files\data.txt')

2.打开方式

1)r是只读

f = open(r'files\data.txt', 'r')   # 以指定的方式打开指定文件,并返回文件
 再进行读操作
f.read()
f.write('xy')   报错
2.w是只写的,并且会清空原文件
f = open(r'files\data.txt', 'w')
  再进行写操作
f.write('xy')
f.read()   报错
3.a是只写的,并且会清空原文件
f = open(r'files\data.txt', 'a')
  再进行写操作
f.write('abc')
f.read()  报错

4)读的方式打开不存在的文件会报错,写的方式打开不存在的文件不会报错并且会自动创建文件
open(r'files\data1.txt', 'r')  报错
open(r'files\data1.txt', 'w')
open(r'files\data2.txt', 'a')

5)t是字符串

f = open(r'files\data.txt', 'rt')

获取读它的数据

result = f.read()
print(type(result))  # <class 'str'>
f = open(r'files\data.txt', 'at')
f.write('29')

6)b是二进制

f = open(r'files\data.txt', 'rb')
# 获取读它的数据
result = f.read()
print(type(result))  # <class 'bytes'>
# f = open(r'files\data.txt', 'ab')
# f.write(bytes('abc', encodings='utf-8'))

3.编码方式

# f = open(r'files\data4.txt', 'w', encoding='gbk')
# f.write('aaa数据实际上')
# f = open(r'files\data4.txt', encoding='gbk')
# print(f.read())
f = open(r'files\data4.txt', 'w', encoding='utf-8')
f.write('hahahahahah')

2.2 操作文件

1)文件读操作
文件对象.read() - 从读写位置开始,读到文件结尾(读写位置默认在文件的开头)
文件对象.readline()-从读写位置开始,读到一行结束 ————读一行

2)文件写操作

w = open(r'files\test2.txt', 'rt', encoding='utf-8')
result1 = w.read()
print(result1)

移动读写位置到文件开头

w.seek(0)    # 将光标移动到开头
result1 = w.read()
print(result1)    #第二次read从上次读写位置结束开始,所以第二次读为空——(读写位置变了)
print(w.readline())

练习:读test2中的内容,一行一行读,读完为止

while True:
    result1 = w.readline()
    if result1 == '':
        break
    print(result1, end='')
f2 = open(r'files\data.txt', 'wt', encoding='utf-8')   # 只有以w写方式打开一次才会清空
f2.write('555555555')
f2.write(str([10, 20, 30]))

2.3 关闭文件

# 文件对象.close
# f2.close()

with open(r'files\data.txt', 'r', encoding='utf-8') as f2:
    print(f2.read())
# f.read()    报错因为在with外已经自动close关闭了

二.数据持久化

1.对程序中的数据做持久化的步骤

第一步:确定持久化对象(到底哪些数据需要持久化)
第二部:选择合适的文件,并且确定文件初始内容
第三步:在程序中需要这个数据的时候从文件中读数据
第四步:在数据发生改变以后需要将最新数据写入到文件中

练习:写程序打印程序被执行的次数

持久化对象:已经运行过的次数

f1 = open(r'files\count.txt', encoding='utf-8')
# 获取上一次的次数
count = int(f1.read())
count += 1
print(count)

# 保存最新的次数
f2 = open(r'files\count.txt', 'wt', encoding='utf-8')
f2.write(str(count))
f2.close()

练习2:写程序添加学生信息,并且打印已经添加过的所有的学生

第1次运行:请输入学生姓名: 小明小明第2次运行:请输入学生姓名: 小花小明 小花

name = input('请输入姓名')
f3 = open(r'files\student.txt', 'at', encoding='utf-8')
f3.write(name + ' ')
f3.close()

f4 = open(r'files\student.txt', 'rt', encoding='utf-8')
print(f4.read())
f4.close()

练习3:写程序添加学生信息,并且打印已经添加过的所有的学生

“”"
第1次运行:
请输入学生姓名: 小明
请输入学生的成绩: 89
[{‘name’: ‘小明’, ‘score’: 89}]

第2次运行:
请输入学生姓名: 小花
请输入学生的成绩: 100
[{‘name’: ‘小明’, ‘score’: 89}, {‘name’: ‘小花’, ‘score’: 100}]
“”"

# 补充:eval函数
# eval(字符串)  —— 获取字符串引号中的结果
name = input('请输入姓名')
score = input('请输入成绩')
student = {'name': name, 'score': score}
f4 = open(r'files\students.txt', 'at', encoding='utf-8')
f4.write(str(student) + ' ')
f4.close()

f5 = open(r'files\students.txt', 'rt', encoding='utf-8')
list1 = list(eval(f5.read()))
print(list1)
f5.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值