文件操作相关知识点-12.28

          #                                  文件操作相关知识点

一. 文件操作

“”"
1.计算机内存分为两种:运行内存、硬盘(磁盘)

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

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

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

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

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

2.1 打开文件

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

  1. file - 需要打开的文件的路径(文件地址)
    1)绝对路径 - 文件在计算机中的全路径(windows电脑从盘名开始写)
    2)相对路径 - a.写路径的时候用.开头表示当前目录(当前目录指的是当前代码文件所在的文件夹)
    b.写路径的时候用…开头表示当前目录的上层目录

  2. mode - 文件打开方式;
    作用:a.决定打开文件后是能读还是能写; b.决定操作文件的时候数据的类型是字符串还是二进制
    两个作用对应有两组值:

             1) 第一组:决定打开后是读还是写
         | -                                                            | -    |      |      |
         | ------------------------------------------------------------ | ---- | ---- | ---- |
         | r   -   只读;如果文件不存在会报错                           |      |      |      |
         | w   -   只写;打开文件的时候会先清空原文件;如果文件不存在不会报错并且会自动创建文件 |      |      |      |
         | a   -   只写;打开文件的时候不会清空原文件;如果文件不存在不会报错并且会自动创建文件 |      |      |      |
         
         ​    
         
             2)第二组:决定操作文件的时候数据的类型(str、bytes)
             t(默认值)   -   字符串类型(操作文件的时候涉及到的数据必须是字符串)  - 打开文本文件
             b          -   二进制类型(bytes)  - 二进制文件(图片、视频、音频、pdf)只能用b
         
         
         ​    
             注意:给mode赋值的时候必须在两组中每一组选择一个值
                  'rt'、'tr'、'rb'、'br'、'r'
                  'wt'、'wb'、'tw'、'bw'、'w'
                  ...
    
  3. encoding - 文本编码方式(只有以t的方式打开文件的时候才考虑给encoding赋值)
    不同的文本编码方式决定字符编码在保存的时候采用的字节数(大小)
    1)常用的文本编码方式:
    gbk: 英文符号单字节、中文符号双字节
    utf-8: 英文符号单字节、中文符号三字节

                 2)使用原则:
                 不同的时候操作同一个文件采用的编码方式必须一致(不一致可能乱码也可能直接报错)
    

1. 文件路径

使用绝对路径

open(r'/Users/yuting/Work/授课/千锋学习/自己的代码/01语言基础/day13-文件操作/files/data.txt')

使用相对路径


open('./files/data.txt')

相对路径如果是以’./‘开头的,’./'可以省略

open('files/data.txt')

相对路径

open('./demo.py')

使用…对应的相对路径

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

2. 打开方式

# 1) r是只读的
# f = open('files/data.txt', 'r')
# f.read()
# f.write('xy')     # 报错

# 2)w是只写的,并且会清空原文件
# f = open('files/data.txt', 'w')
# f.write('xy')
# f.read()      # 报错!  not readable

# 3)a是只写的,并且不会清空原文件
# f = open('files/data.txt', 'a')
# f.write('abc')
# # f.read()      # 报错! not readable

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

# 5)t是字符串
f = open('files/data.txt', 'rt')
result = f.read()
print(type(result))     # <class 'str'>

f = open('files/data.txt', 'at')
f.write('29')


# 6)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'))


# 3. 编码方式
# f = open('files/data4.txt', 'w', encoding='gbk')
# f.write('aaa数据实际上是')

# f = open('files/data4.txt', encoding='gbk')
# print(f.read())


# f = open('files/data5.txt', 'w', encoding='utf-8')
# f.write('aaa数据实际上是')

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

2.2 操作文件

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

2)文件写操作
文件对象.write(数据) - 将指定数据写入到指定文件中
“”"

f = open('files/test1.txt', 'rt', encoding='utf-8')
result = f.read()
print(result)

# 移动读写位置到文件开头
f.seek(0)
result = f.read()
print(result)


f.seek(0)

2.3 关闭文件

# 文件对象.close()
f2.close()
# f2.write('ancm')      # ValueError: I/O operation on closed file.

# f = open('files/data.txt')

with open('files/data.txt', 'r', encoding='utf-8') as f:
    print(f.read())

# f.read()      # ValueError: I/O operation on closed file.

练习

# 练习:读test1中的内容,一行一行的读,读完为止
while True:
    result = f.readline()
    if result == '':
        break
    print(result, end='')

print('---------------------------------------华丽的分割线------------------------------------')
f2 = open('files/data.txt', 'wt', encoding='utf-8')
f2.write('hello world!')
f2.write(str([10, 20, 30, 40]))

二.数据持久化

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

“”"
第1步:确定持久化对象(到底哪些数据需要持久化)
第2步:创建文件并且确定文件初始内容
第3步:在程序中需要这个数据的是从文件中读数据
第4步:在数据发生改变以后需要将最新的数据写入到文件中
“”"

练习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()

练习

# 持久化对象:所有添加的学生的名字
name = input('请输入学生姓名:')

# 将新添加的学生保存到文件中
f = open('files/students.txt', 'a', encoding='utf-8')
f.write(name + ' ')
f.close()

# 打印所有已经添加过的学生
f = open('files/students.txt', 'r', encoding='utf-8')
print(f.read())
f.close()


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

第2次运行:
请输入学生姓名: 小花
请输入学生的成绩: 100
[{'name': '小明', 'score': 89}, {'name': '小花', 'score': 100}]
"""
# 持久化对象:所有已经添加过的学生信息
name = input('请输入学生姓名:')
score = input('请输入学生的成绩:')

# 获取之前已经添加过的所有的学生
f = open('files/students2.txt', encoding='utf-8')
all_student = eval(f.read())      # type: list
f.close()

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

# 更新文件
f = open('files/students2.txt', 'w', encoding='utf-8')
f.write(str(all_student))
f.close()

# 补充:eval函数
# eval(字符串)  -  获取字符串引号中结果
# str(100)  -> '100'
# str([10, 20, 30])   -> '[10, 20, 30]'

# eval('100')   ->  100
# eval('[10, 20, 30]')  -> [10, 20, 30]
# eval('"abc"')  -> "abc"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值