Day-13 文件操作

Day-13 文件操作

1.文件操作

​ 计算机内存分为两种:运行内存、硬盘(磁盘)。

​ 保存在运行内存中的数据在程序运行结束后会自动销毁;保存在硬盘中的数据除非人为删除或者硬盘损坏否则会一直存在。

​ 程序中数据默认是保存在运行内存中的。

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

2.文件操作

打开文件后,操作文件中的内容。

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

2.1打开文件
open(file,mode = 'r',*,encoding=None)   -   以指定的方式打开指定文件,并且返回文件对象。

file - 需要打开的文件的路径(文件地址)

  • 绝对路径 - 文件在计算机的全路径(windows电脑从盘名开始写)。
  • 相对路径 - a.写路径的时候用,开头表示当前目录(当前目录指的是当前代码文件所在的文件夹); b.写相对路径的时候用…开头表示当前目录的上层目录。

mode - 文件打开方式:

  • 作用:决定打开文件后能读还是能写,同时绝对操作文件的时候数据的类型是字符串还是二进制。

  • 两个作用对应有两组值。

    • 第一组:决定打开后的读写方式。
    r(默认值)   -   只读;如果文件不存在会报错。
    w   -   只写;打开文件会先清空删除原文件内容,然后再写;如果文件不存在不会报错并且会自动创建。
    a   -   只写;打开文件后不会清空原文件,写的时候直接在原内容后面追加;如果文件不存在不会报错并且会自动创建。
    
    • 第二组:决定操作文件的时候数据的类型(str、bytes)。
    t(默认值)  -   字符串类型(操作文件的时候涉及到的数据必须是字符串)  -   打开文本文件。
    b   -   二进制类型(bytes   -   二进制文件(图片、视频、音频、pdf)只能用b打开。
    
  • 注意:给mode赋值的时候必须在两组中每一组选中一个值也只能选一个:‘rt’,‘tr’,‘rv’,‘ab’,‘wt’,…

encoding - 文本编码方式(只有以t的方式打开文件的时候才考虑给encoding赋值)

不同的文本编码方式决定字符编码在保存的时候采用的字节数(大小)

  • 常用的文本编码方式:
gbk:英文符号单字节,中文符号双字节保存;
utf-8:ASCII码表符号用单字节,中文符号三字节
  • 使用原则:
不同的时候操作同一个文件采用的编码方式必须一致(不一致可能乱码也可能直接报错)

补充:计算机内存单位

8位 = 1字节
1kb = 1024字节
1mb = 1024kb
1gb = 1024mb
  • 使用绝对路径
open(r'D:\qianfengjiaoyu\own write\01pivotGrammar\day12- iterator And module\tools\text1.py')
  • 使用相对路径
open('./files/data.txt')
  • 相对路径如果以’./‘开头的,’./'可以省略
open('files/data.txt')
  • 使用‘…’对应的相对路径
open('../day13 file operations/files/data.txt')
2.1.1打开方式
  • r是只读的
f = open('files/data.txt', 'r')
f.read()
# f.write('xx')		# 报错
  • w是只写的,并且会清空原文件
f = open('files/data.txt', 'w')
f.write('xy')
  • a是只写的,并且不会清空原文件
f = open('files/data.txt', 'a')
f.write('asd')
  • 读的方式打开不存在的文件会报错,写的方式打开不存在的文件不会报错并且会自动创建
# open('files/data1.txt', 'r')	#报错
open('files/data1.txt','w')		# 没有会自动创建
open('files/data2.txt', 'a')	# 没有会自动创建
  • mode中的 t 表示字符串
f = open('files/data.txt', 'rt')
result = f.read()
print(type(result))		# <class 'bytes'>
  • mode中的 b 表示二进制
f = open('files/data.txt', 'rb')
result = f.read()
print(type(result))		# <class 'bytes'>

f = open('files/data.txt', 'ab')
f.write(bytes('abc', encoding='utf-8'))
2.1.2编码方式
f = open('files/data.txt', encoding='gbk')
print(f.read())
2.2操作文件

文件读操作

文件对象.read() - 从读写位置开始,读到文件结尾(读写位置默认在文件的开头)

文件写操作

文件对象.write(数据) - 将指定数据写入到指定文件

f = open('files/text.txt', 'rt', encoding='utf-8')
result = f.read()
print(result)
  • 一般打开一次文件只能读一次,第二次读需要移动读写位置到文件开头
f.seek()
  • 读一行
print(f.readline())

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

f = open('files/text.txt','rt', encoding='utf-8')
while True:
    result = f.readline()
    if not result:
        break
    print(result, end='')
f.close()

f2 = open('files/data.txt', 'wt', encoding='utf-8')
f2.write('hello world!')
f2.write(str[10, 20, 30, 40])
2.3关闭文件
  • 文件对象.close()
f2.close()
  • with open这种打开方式在离开后会自动关闭
with open('files/data.txt') as f:
    print(f.read())
  • f.read() # ValueError: I/O operation on closed file.
3.数据持久化
3.1对程序中的数据做持久化的步骤

第一步:确定持久化对象(到底那些数据需要持久化)

第二步:创建文件并且确定文件初始内容

第三步:在程序中需要这个数据的是从文件中读数据

第四步:在数据发生改变以后需要将最新的数据写入到文件中

  • 练习:写程序打印程序被执行的数据
# 持久化对象:已经运行过的次数
f1 = open('files/count.txt', encoding='utf-8')
# 获取上一次运行的次数
count = int(f1.read())
f1.close

count += 1
print(count)

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

eval(字符串) - 获取字符串引号中的结果

eval(‘100’) -> 100

eval(‘[10, 20, 30]’) -> [10, 20, 30]

eval(‘“abc”’) -> “abc”

  • 练习:写程序添加学生信息,并且打印已经添加过的所有学生
第1次运行:
请输入学生姓名: 小明
请输入学生的成绩: 89
[{'name': '小明', 'score': 89}]

第2次运行:
请输入学生姓名: 小花
请输入学生的成绩: 100
[{'name': '小明', 'score': 89}, {'name': '小花', 'score': 100}]
name = input('请输入学生姓名:')
score = input('请输入学生成绩:')
# 获取之前已经添加过的所有学生
f = open('files/stu.txt', encoding='utf-8')
all_stu = eval(f.read())
f.close()

# 添加这次添加的学生
all_stu.append({'name':name, 'score':score})
print(all_stu)

# 更新文件
f = open('files/stu.txt', 'wt', encoding='utf-8')
f.write(str(all_stu))
f.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值