23.文件的基本操作
一. 什么是文件
文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位。文件的操作是基于文件的,核心操作是读和写。比如说我们想要操作文件就是对操作系统发起请求,然后由操作系统将用户或应用程序对文件的读写操作转换成集体的硬盘指令(比如控制盘片转动,控制机械手臂移动,以此来读取数据)。
二. 为什么要有文件
内存无法永久保存文件,但是我们想要永久的保存数据到我们的硬盘之中,用户/应用程序可以通过操作文件将数据永久的保存在硬盘中,操作文件就可以实现对硬件的操作,所以我们说用户/应用程序对文件进行的所有的操作,都是在向操作系统发送调用,然后由操作系统将其转换为具体的硬盘操作
三. 绝对路径和相对路径
3.1 绝对路径
- Windows系统绝对路径从盘符(C:\、D:\)开始写的一个完整路径
- macos系统从根目录(/Users)开始写一个完整的路径。
3.2 相对路径
相对于当前执行的文件所在的文件夹开始找
f = open('like.txt')
# like.txt与该.md文档同路径位置
四. 如何用文件
4.1 从硬盘中读取数据
如果我们需要打开一个文件,需要想操作统发送情求,要求操作系统打开文件,占用操作系统的资源。Python中使用open()的方法可以打开具体的文件,open()方内写入文件的路径,例如:
f = open(r'I:\正课内容\day11\文件处理\测试.txt',mode='rt',encoding='utf-8')
res= f.read()
print(res)
# 你好
#f的值是一种变量,占用的是应用程序的内存空间
如果给出列表增加值,我们需要对列表赋值之后再对列表增加值。文件也是如此。
lis = [1,2,3]
lis.append(4)
lis.append(5)
# 打开文件
f = open(r'lis = [1,2,3]
lis.append(4)
lis.append(5)
# 打开文件
f = open(r'F:\文件\Python\Markdown文档\自己的\正式上课\自我归纳\五.文件处理\wenben.txt')
print(f)
print(f)
打开文件之后,文件不仅占用了内存,他还对应了操作系统打开的文件,并且我们说,打开文件不是目的,读写文件才是目的。
# read模式打开文件
f = open(r'F:\文件\Python\Markdown文档\自己的\正式上课\自我归纳\五.文件处理\wenben.txt', mode='r')
# 读取文件内容,向操作系统发起读请求,会被操作系统转成具体的硬盘操作,将内容由硬盘读入内存
data = f.read()
print(data)
# 由于Python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源资源
# del f 只是回收变量f
f.close() #回收系统资源,因为操作系统打开的文件数是有规定的,此时变量f还是存在的,但是不可以在进行读操作了
4.2 写入数据
# write模式打开文件
f = open(r'F:\文件\Python\Markdown文档\自己的\正式上课\自我归纳\五.文件处理\wenben.txt', mode='w')
f.write("""name = 'nick'
pwd = '123'""")
f.close()
f = open(r'F:\文件\Python\Markdown文档\自己的\正式上课\自我归纳\五.文件处理\wenben.txt', mode='r')
data = f.read()
print(data)
4.2.1 只读模式( r )
- 当文件不存在时报错
- 当文件存在时,read()不加参数,文件指针跳到最开始位置,从头读到尾,
with open('c.txt',mode='rt',encoding='utf-8') as f:
res = f.read() #把文件全部的内容从硬盘读到内存
print(res)
4.2.2 只写模式( w )
- 当文件不存在时穿件空白文件
- 当文件存在时,w会清空文件,指针移动到开始位置
注意:
1.在以w模式打开文件 没关闭的情况下,新的写入内容总是跟在旧的后面
2.如果重新打开文件,则会清空文件的全部内容
with open('测试.txt',mode='wt',encoding='utf-8') as f:
# f.read() 不可读
f.write('132\n')
4.2.3 追加模式( a )
- 当文件存在时,文件指针会直接跳到末尾,然后开始写文件
- 当文件不存在时,会自动创建空白文件
with open('测试.txt',mode='at',encoding='utf-8') as f:
res = f.write('10101010')
4.2.4 w和a模式异同
-
w和a模式异同点:
1.相同点:打开文件不关闭的情况下,连续的写入,新写的总会跟着前面的内容
2.不同点:a模式重新打开文件,不会清空文件,会将指针移动到文件的尾部然后执行写操作 -
各自用处:
a模式一般用来在原来的文件基础上进行修改,例如修改日志,记录账号密码信息等
w模式用来写全新的文件
4.2.5 其它使用( + )
注意:+不能单独使用,必须配合r、w、a一起使用
- r+t: 可读、可写
# r+
with open('测试.txt',mode='r+',encoding='utf-8') as f:
print(f.writable())
print(f.readable())
# True
# True
- w+t: 可写、可读
# w+
with open('测试.txt',mode='w+',encoding='utf-8') as f:
print(f.writable())
print(f.readable())
# True
# True
- a+t: 可追加、可读
#a+
with open('测试.txt',mode='a+',encoding='utf-8') as f:
print(f.writable())
print(f.readable())
# True
# True
五. with管理文件操作上下文
之前我们使用open()方法操作文件,但是open打开文件后我们还需要手动释放文件对操作系统的占用。其实我们可以更方便的打开文件,即Python提供的上下文管理工具——with open()。
with open('I:\正课内容\day11\文件处理\测试.txt', 'rt') as fr:
res = fr.read()
print(res)
# lwx
with open()方法不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。
with open('I:\正课内容\day11\文件处理\测试.txt', 'rt') as f1,\
open('I:\正课内容\day11\文件处理\测试二','rt') as f2: # \ 提供换行功能,让代码整洁,本质上还是一行代码
res1 = f1.read()
res2 = f2.read()
print(res1)
print(res2)
# lwx
# nihao
六. 指定字符编码
with open('c.txt',mode='rt') as f:
res = f.read()
print(res,type(res))
'''
上述代码编码错误,进行报错
Traceback (most recent call last):
File "I:/正课内容/day11/文件处理/指定字符编码.py", line 2, in <module>
res = f.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0x88 in position 8: incomplete multibyte sequence
'''
'''
1. c.txt写的时候用utf-8模式存储的,现在c.txt在硬盘上也是用utf-8编码格式存储的二进制
2. 我们用的是rt-->t模式,文本模式,open功能会自动将读出来的utf-8模式的二进制解码成Unicode,也就是解码成字符串,但是只针对纯文本文件
3. 我们没有规定打开文件的字符编码,他就会按照默认的编码格式打开文件,
windows 默认的是gbk
Linux Mac 默认的是utf-8
'''
#指定编码格式后:
with open('c.txt',mode='rt',encoding='utf-8') as f:
res = f.read()
print(res,type(res))
#哈哈哈 <class 'str'>
七. 总结
打开文件总而言之分为三步
- 打开文件
- 读写
- 关闭
f = open(r'I:\正课内容\day11\文件处理\测试.txt',mode='rt',encoding='utf-8')
res = f.read()
print(res)
f.close()