day2023-3-23-文件操作

本文介绍了计算机数据储存的两种形式,内存和硬盘,强调了数据持久化的重要性,并详细阐述了如何通过文件操作实现数据的保存和读取,包括文件路径、打开方式、文本文件编码等关键概念。同时,文章提供了多个示例说明如何在Python中进行文件读写操作,并探讨了数据持久化在程序设计中的应用,如保存程序运行次数和学生信息管理。
摘要由CSDN通过智能技术生成

一、数据存储

1.计算机数据储存

计算机内存分为运行内存和硬盘两种:保存在运行内存中的数据在程序运行结束后会自动释放,保存在硬盘中的数据会一直存在(除非手动删除或者硬盘损坏)

2.数据持久化

—— 以文件为单位,将数据保存到硬盘中

数据持久化又叫数据本地化,指的就是将程序中的数据保存在硬盘中(程序中的数据默认是保存在运行内存中的)
硬盘保存数据的基本单位是文件,所以如果想要把数据保存到硬盘中,就需要将数据保存到文件中。

常见的数据持久化:数据库(.db、.sqlite)、excel文件、csv文件、txt文件、json文件、plist文件等

3.文件操作

—— 操作文件内容

文件操作的基本步骤:打开文件 ——> 操作文件内容(读操作、写操作) ——> 关闭文件

1)打开文件
open(文件路径, 文件打开方式='r', encoding=文本文件编码方式)

1.文件路径 —— 文件在计算机中的位置信息。
文件路径分为两种,分别是绝对路径和相对路径:
1)绝对路径:文件在计算机中的全路径
2)相对路径:
注意:使用相对路径之前,需要先将被操作的文件放在目录中

a.在写路径的时候用 . 表示当前目录(当前目录指的是当前写代码的代码文件所在的文件夹)
b.在写路径的时候用 .. 表示当前目录的上层目录
注意:路径是以'./'开头的时候,'./'可以省略
# 使用绝对路径
open(r"D:\千锋学习\05相关文件\数据分析岗位数据.xlsx")

# 使用相对路径
open(r'./files/data1.txt')
2.文件打开方式 —— 决定了打开文件后能做什么(是能读还是能写?);还决定操作文件的时候数据的类型(是字符串还是二进制?)
第一组值:r、w、a
r —— 只读,如果文件不存在会报错
w —— 只写,打开的时候会先清空原文件,文件不存在会创建文件
a —— 只写,打开的时候不会清空原文件,文件不存在会创建文件

第二组值:t、b
t —— 字符串类型(读到的数据,和写入文件中的数据必须是字符串)
b —— 二进制类型(bytes;读到的数据,和写入文件中的数据必须是二进制)

给打开方式赋值的时候必须在两组值中每一组选一个值,如果第二组不选默认选择 t:
rt(tr、r)、rb(br)、wt(tw、w)、wb(bw)、at(ta、a)、ab(ba)
# ---------r只读----------
f = open('files/data1.txt', 'r')
f.read()
f.write('abc')     # 报错

# -----------a只写,并且不会清空原文件---------------
f = open('files/data1.txt', 'a')
f.read()            # 报错
f.write('abc')

# -----------w只写,并且会清空原文件---------------
f = open('files/data1.txt', 'w')
# f.read()            # 报错
f.write('abc')

# r打开不存在的文件程序会报错
f = open('files/data2.txt', 'r')     # 报错

# w 和 a 打开不存在的文件程序不会报错,并且会自动创建这个文件
f = open('files/data2.txt', 'w')
f = open('files/data3.txt', 'a')



# --------------------t —— 数据的类型是字符串----------------------
f = open('files/data1.txt', 'rt')
result = f.read()
print(type(result))   # <class 'str'>

f = open('files/data1.txt', 'a')
f.write(100)    # 报错,'a'要求写入的数据必须是字符串类型
f.write('100')

f = open('files/data1.txt', 'ab')
f.write(100)      # 报错,'ab'要求写入的数据必须是二进制类型

补充:常见计算机内存单位

  • w位(bit)
  • 1字节(bytes)= 8位
  • 1kb = 1024字节
  • 1mb = 1024kb
  • 1G = 1024mb
  • 1T = 1024G
3)文本文件编码方式
不同的文本文件编码方式,在保存同一个符号的编码值的时候采用的字节数不同
常见的文本文件编码方式:utf-8,gbk
utf-8: 一个数字和字母采用1个字节保存;一个中文用3个字节保存
gbk: 一个数字和字母采用1个字节保存;一个中文用2个字节保存

使用编码方式的要求;前后一致(存储数据的时候采用编码值必须和获取数据的时候采用编码值一致)
注意:以b的方式打开文件,encoding不能赋值
# 用utf-8方式写文件
f = open('files/data4.txt', 'w', encoding='utf-8')
f.write('lisa,你好')
# 用utf-8方式读文件
f = open('files/data4.txt', 'r', encoding='utf-8')
print(f.read())         # lisa,你好
# 用gbk方式读文件
f = open('files/data4.txt', 'r', encoding='gbk')
print(f.read())           # lisa,浣犲ソ

# 用gbk方式写文件
f = open('files/data4.txt', 'w', encoding='gbk')
f.write('lisa,你好')
# 用utf-8方式读文件
f = open('files/data4.txt', 'r', encoding='utf-8')
print(f.read())             # 报错
2)操作文件
1.文件读操作(获取文件内容)
a.文件对象.read  —— 获取整个文件内容(从读写位置开始获取到文件结束,读写位置默认文件开头)
b.文件对象.readline() —— 从读写位置开始读到一行结束

注意:读操作会改变读写位置
文件对象.seek(0) —— 将读写位置移动到文件开头

2.文件写操作(包括增加内容、修改内容、删除内容)
a.文件对象.write(内容) —— 将指定内容写入到指定文件中

3.关闭文件
文件对象.close()

以下方式,可以不用关闭文件,操作完会自己关闭文件
with open(文件路径, 打开方式, encoding=文本文件编码方式) as 文件对象:
    代码块
f = open('files/data1.txt', encoding='utf-8')
result = f.read()
print(result)

print('--------------------------------------------------华丽的分割线--------------------------------------------------')
f.seek(0)
result = f.read()
print(result)

print('--------------------------------------------------华丽的分割线--------------------------------------------------')

f.seek(0)
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
result = f.readline()
print(result, len(result))       # <class 'str'> 0

# 练习:读文件内容,一行一行的读完为止
f.seek(0)
while True:
    result = f.readline()
    if result == '':
        break
    else:
        print(result)
    
# 文件关闭之后,再对文件进行读写操作,会报错
f = open('files/data2.txt', 'w', encoding='utf-8')
f.write('python')
f.close()
f.write('\njava')      # 报错


# 使用with open的方式打开文件,不需要关闭文件操作
with open('files/data1.txt', 'a', encoding='utf-8') as f:
    f.write('abc')

f.write('123')       # 脱离with的代码块,报错

二、应用

1.数据持久化方法

—— 让这次程序产生的数据可以在下一次运行程序的时候使用
第一步:确定需要持久化的数据
第二步:创建文件,并且确定文件初始内容
第三步:做到在程序中需要这个数据的时候从文件中获取这个数据
第四步:做到这个数据如果发生改变,必须将最新的数据更新到文件中
# 案例1:写程序打印程序运行次数
# 获取上一次的运行次数
f = open('files/runTime.txt', encoding='utf-8')
count = int(f.read())
f.close()
# 再让次数加1
count += 1
# 打印次数
print(count)
# 更新文件内容
f = open('files/runTime.txt', 'w', encoding='utf-8')
f.write(str(count))
# 练习1:
"""
请输入需要添加的学生的名字:小明
小明

请输入需要添加的学生的名字:小花
小明 小花

请输入需要添加的学生的名字:张三
小明 小花 张三
"""

# 需要持久化的数据:已经添加过的所有的学生的名字

# 方法1
f = open('files/names.txt', 'a', encoding='utf-8')
name = input('请输入需要添加的学生的名字:')
f.write(name+' ')
f.close()

f = open('files/names.txt', encoding='utf-8')
print(f.read())
f.close()


# 方法2
name = input('请输入需要添加的学生的名字:')

try:
    f = open('files/names1.txt', encoding='utf-8')
    students = f.read()
    f.close()
except FileNotFoundError:
    students = ''

students += name + ' '
print(students)

f = open('files/names1.txt', 'w', encoding='utf-8')
f.write(students)
f.close()

# 案例2
"""
姓名:lisa
性别:女
年龄:18
打印:[{'name': 'lisa', 'gender': '女', 'age': 18}]

姓名:jenny
性别:女
年龄:19
打印:[{'name': 'lisa', 'gender': '女', 'age': 18}, {'name': 'jenny', 'gender': '女', 'age': 19}]
"""

# 需要持久化的数据:所有已经添加的学生的信息
name = input('姓名:')
gender = input('性别:')
age = int(input('年龄:'))

# 获取之前添加过的所有学生
try:
    f = open('files/学生信息.txt', encoding='utf-8')
    all_students = eval(f.read())
    f.close()
except FileNotFoundError:
    all_students = []

all_students.append({'name': name, 'gender': gender, 'age': age})

print(all_students)

f = open('files/学生信息.txt', 'w', encoding='utf-8')
f.write(str(all_students))
f.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值