文章目录
一、补充知识点
- 变量都是归属于应用程序的内存, 例如x= 10归属于python的内存空间
二、文件
应用程序运行过程中产生的数据最先都是存放于内存中的,若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统,而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。
2.1 什么是文件?
文件是操作系统提供给用户/应用程序 操作硬盘的一种虚拟的概念/接口
用户/应用程序(open)
操作系统(文件)
计算机硬件(硬盘)
2.2 为什么要用文件?
- 将原本存放于内存中的数据保存在硬盘中
用户/应用程序可以通过文件将数据永久保存在硬盘中,即操作文件就是操作硬盘
用户/应用程序直接操作的是文件, 对文件进行的所有操作, 都是在向操作系统发送系统调用,然后再由操作系统将其转换成具体的硬盘操作
2.3 如何用文件?
- open()
三、文件的使用
3.1 基本操作流程
- 操作文件的基本流程
1、打开文件
# windows路径分隔符问题
open('C:\a\nb\c\d.txt')
# 解决方案一:推荐
open(r'C:\a\nb\c\d.txt')
# 解决方案二:
open('C:/a/nb/c/d.txt')
# 绝对路径 : 全部路径
# 相对路径 : 相对于当前文件为起始
# 有无返回值 有 f的值是一种变量,占用的是应用程序的内存空间
f = open(r'aaa/a.txt', mode='rt')
2、操作文件:读/写文件, 应用程序对文件的读写请求都是在向操作系统发送系统调用,然后由操作系统控制硬盘把数据读入内存,或者写入硬盘,
res = f.read()
3、关闭文件
f.close() # 回收操作系统的资源 操作系统的打开文件数是一定的
def f # 回收应用程序的资源 (不需要有垃圾回收机制)
3.2 模式介绍
- 控制文件读写内容的模式: t和b, t和b不能单独使用, 必须和r/w/a连用
- 控制文件读写操作的模式:
r :只读模式
w :只写模式
a : 只追加写模式
+ : r+、w+、a+ 可读可写
x :了解x模式
3.3 详细介绍文件模式t、b、r、w、a、+、x
- t :文本(默认的模式)
1、读写都是以str(unicode)为单位的
2、只针对文本文件
3、必须指定一个编码encoding=“utf-8”
# 对于f.read来说是将f就是文件对象, 向操作系统发请求,请求将硬盘(utf-8格式的二进制)上的c.txt读取到内存中, 但是用的是t模式, 读出来的一定是str(unicode)的格式
# 所以f.read本质读取的是utf-8但是模式t强制将read读出来的结果解码(utf-8)成unicode
with open('c. txt', mode=' rt',) as f:
res=f. read()
print(res, type(res))
# 结论: 操作系统默认的编码,对于open的encoding:liunx系统默认是utf-8, windows系统默认是gbk
- b :二进制/Bytes
1、读写都是以Bytes为单位的
2、可以针对所有文件
3、一定不能指定字符编码encoding
with open('test.jpg', mode=' rb',) as f:
res=f. read() # 硬盘的二进制读入内存->b模式下,不做任何转换, 直接读入内存
print(res, type(res))# bytes类型-》当成二进制
- r :只读模式,当文件不存在时报错,当文件存在时文件指针跳到开头
with open('c.txt',mode='rt',encoding='utf-8')as f:
print('第一次读.center(50, '*'))
res=f.read() # 把所有内容从硬盘读入内存
print(res)
#with open('c.txt',mode='rt',encoding='utf-8')as f:
print('第二次读.center(50, '*')
res1 =f.read()
print(res1) # 为空 因为指针指到文件末尾
- w : 只写模式、当文件不存在的时候会创建一个空文件, 当文件存在时w会清空文件, 指针为于开始位置,
# 重新以w模式打开文件, 文件会清空
with open('d.txt',mode='wt',encoding='utf-8')as f:
#f.read()#不可读I
f.write('哈哈哈哈\n')
-
a :只写模式 只追加写、文件不存在时创建空文档, 在文件存在时, 文件指针之直接跳到末尾。
-
强调 w 模式与 a 模式的异同:
1、相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
2、不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后 -
了解+模式 :可读可写 必须配合r、w、a
r 指针在开头
w指针在末尾, 读不出来
a指针在末尾, 读不出来
- x :只写模式, 【不可读; 不存在则创建, 存在则报错, 指针在开头】# 就是加了一个判断
3.4 资源回收与with语法
- with上下文管理
# 文件对象又称为文件句柄(手柄 操作文件的)
# with会帮你f.close()
with open('a.txt', mode='rt') as f:
res = f.read() # 操作系统把文件从硬盘读到了内存
# with 可以同时打开多个
with open('a.txt', mode='rt') as f open('b.txt', mode='rt') as f1:
res = f.read() # 操作系统把文件从硬盘读到了内存
res1 = f1.read()
3.5 文件的操作的其他方法
- readline
# readline:一次读一行 readlines: 读取大列表全部
with open(r'g.txt',mode='rt',encoding='utf-8')as f:
resl=f.readline() # 与for循环相等
for line in f:
line=line
# writelines 相当于for循环
#1=['11111\n',2222','3333',4444]
J=[’11111\n','2222','3333]
for line in 1:
f.write(line)
f.writelines(l)
- 如果是纯英文字符,可以直接加前缀b得到bytes类型
- ‘上’.encode(‘utf-8)等同于bytes('上’,encoding='utf-8)
- flush
# flush:
with open('h.txt',mode='wt',encoding='utf-8')as f:
f.write('哈') # 告诉操作系统把数据给我从内存发到硬盘, 但是不是你写点就发送的 人话就是卡车运货
f.flush() # 写完立即发送到硬盘
3.6 文件的高级操作:控制文件指针的移动
- 指针移动的单位: 字节(Bytes)
- 只有一中情况特殊:
t 模式下的read(n)、n代表的是字符个数
其他涉及指针的单位都是字节(Bytes) - f.seek(n,模式):n指的是移动的字节个数
- 模式:
1、 0:参照物是文件开头位置
f.seek(9,0) # 文件指针走到第9个位置
f.seek(3,0) # 文件指针走到第3个位置
2、 1:参照物是当前指针所在位置
f.seek(9,1) # 文件指针走到第9个位置
f.seek(3,1) # 文件指针走到第13个位置
3、 2:参照物是文件末尾、应该到这移
# 一共12个位置
f.seek(9,2) # 文件指针走到第12个位置
f.seek(-3,2) # 文件指针走到第9个位置
- 强调: 只有0模式可以在t下使用, 1、2必须在b模式下用
- f.tell():获取指针当前的位置(以字节为单位)
3.7 文件修改的两种方式
3.7.1 文本编辑器修改内容的流程
- 硬盘上的数据就没有改这一说、全都是覆盖。内存是可以改的
- 拓展:平时在文本编辑器改内容的流程
1、打开文件:文件全部内容从硬盘加载到内存a.txt
2、改写:改的是内存
3、改完保存:从新将文件a.txt的内容覆盖到硬盘
3.7.2 文件修改的两种方式
- 方式一:文本编辑器采用的就是这种方式
- 优点: 浪费了内存空间
# 缺点: 文件过大会占用内存过大
with open('c.txt', mode='rt',encoding='utf-8')as f:
res = f.read()
data = res.replace('a', 'b')
print(data)
with open('c.txt', mode='wt', encoding='utf-8')as f1:
f1.write(data)
- 方式二:
- 优点: 浪费了硬盘空间
#
import os
with open('c.txt', mode='rt', encoding='utf-8')as f,\
open('.c.txt.swap', mode='wt', encoding='utf-8")as f1:
for line in f:
fl.write(line.replace('a','b'))
# 删除旧的
os.remove('c.txt')
# 将新的改成旧的名字
os.rename('.c.txt.swap', 'c.txt')
相关连接(笔记来自于视频课程和知乎的归类整理):
[1]: https://www.bilibili.com/video/BV1QE41147hU?p=17
[2]: https://zhuanlan.zhihu.com/p/108808704