day15文件操作

一、数据持久化

1. 数据存储

  • 程序中的数据默认是保存在运行内存中的;保存在运行内存中的数据在程序运行结束后会自动销毁。

    导致:这次运行程序产生的数据在下一次运行程序的时候无法使用

  • 如果将数据保存在磁盘中,除了认为删除或者磁盘损坏,数据会一直存在(磁盘是以文件为单位保存数据的)

2. 数据持久化

  • **数据持久化:**就是指将数据以文件的形式保存到磁盘中。
  • **常见的数据持久化工具:**数据库文件(.db、.sqlite)、json文件(.json)、excel文件、csv文件、txt文件、plist文件等

3. 文件操作 - 操作文件内容

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

3.1 打开文件

以指定的方式打开指定文件返回一个文件对象

open(file, mode='r', *, encoding=None)  
  1. file - 文件路径(文件在计算机中的位置)

    路径说明
    绝对路径文件在计算机中的全路径(windows从盘开始写)
    相对路径1.写路径的时候用.表示当前目录(当前目录指的是当前代码文件所在的文件夹)
    2.写路径的时候用…表示当前目录的上层目录

    注意: 必须将需要打开的文件放在工程目录)

绝对路径(打开test.txt文件)

path = r'D:\pythonProject1\day15-文件操作\files\test.txt'
open(path)

相对路径

path = './files/test.txt'
open(path)

path = '../day15-文件操作/files/test.txt'
open(path)
  1. mode

    mode 解决的问题: 文件打开方式(决定打开文件后是能读还是能写?决定打开文件后操作文件的时候对应的数据的类型是字符串还是二进制?

    第一组值 - 决定读写
    r只读
    w只写; 打开的时候会清空原文件内容
    a只写; 打开的时候不会清空原文件内容

注意:如果文件不存在,以读的方式打开会报错,以写的方式打开不但不报错还会自动创建这个文件。

第二组值 - 决定数据类型
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))     # <class 'str'>
  • b 对应的是二进制
f = open('./files/test.txt', 'rb')
result = f.read()
print(type(result))     # <class 'bytes'>
  1. encoding

    encoding表示: 文本文件编码方式(只有在以t方式打开文件的时候才需要设置encoding)

    • 不同的文本文件编码方式保存同一个字符的时候采用内存大小可能不一样
    encoding最常见的两种值
    utf-8一个中文字符用3个字节,英文字符是1个字节
    gbk一个中文字符用2个字节,英文字符是1个字节

    **使用原则:**数据写入文件采用的编码方式要和读文件数据对应的编码方式一致

f = open('./files/a.txt', 'w', encoding='gbk')
f.write('你好!')

f = open('files/a.txt', 'r', encoding='gbk')
print(f.read())

3.2 文件的读写操作

  1. 文件读操作
操作说明
文件对象.read()从读写位置开始读到文件结束(获取整个文件的内容)
文件对象.readline()从读写位置开始到一行结束(只能用于文本文件)
文件对象.readlines()打印成列表
f = open('files/test.txt', 'r', encoding='utf-8')
result = f.read()
print(result)

将读写位置移动到文件开头: 文件对象.seek(0)

f.seek(0)
result = f.read()
print(result)

示例

f.seek(0)
print(f.readline())         # '床前明月光,\n'
print(f.readline())
print(f.readline())
print(f.readline())
print('------------------')
print(f.readline())     # ''

练习:一行一行的读文件内容,直到读完为止。

f.seek(0)
while True:
    result = f.readline()
    if not result:
        break
        
	 print(result)


f.seek(0)
print(f.readlines())
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))

上边if not result: 是当result为空,not result == not False == True

  1. 文件写操作

    文件对象.write(数据)
f = open('files/test.txt', 'a', encoding='utf-8')
f.write('hello world!')

3.3 关闭文件

文件对象.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()

四、eval函数的用法

str(100)   -> '100'
eval('100')  -> 100
str([10, 20, 30])   -> '[10, 20, 30]'
eval('[10, 20, 30]')   -> [10, 20, 30]
  1. 基本用法:将满足某种数据类型结构的数据字符串转换成对应类型的数据
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)

练习:添加学生的名字

效果:

请输入学生的姓名: 小明
['小明']

请输入学生的姓名: 小花
['小明', '小花']
# 方法1
name = input('请输入姓名:')
f = open('files/students2.txt', encoding='utf-8')
all_student = eval(f.read())            # type: list # students文件初始值[],使eval识别数据类型
f.close()
student_names.append(name)
f = open('files/student.txt', 'w', encoding='utf-8')  # 'w'清空初始值[]
f.write(str(student_names))


# 方法2:
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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值