文件处理
一、文件
1.什么是文件:
文件是操作系统为应用程序或者用户提供一种操作硬盘的虚拟单位
强调;
文件是操作系统提供的虚拟单位
应用程序或者用户对文件的读写操作其实都是向操作系统发送指令
2.为何要用文件:
文件对应的硬盘空间,如果需要考虑永久保存数据的话,必须使用文件
3.如何用文件
4.路径问题:
绝对路径:
win: C:\a\b\c\d.txt
linux: /a/b/c/d.txt
无论执行文件在哪,都能在找到。但是不够精简
win 和 linux 开头不一样
相对路径:
相对于当前执行文件所在文件夹
只能以当前执行文件夹为起始,但是精简
二、文件处理基础介绍
1.打开文件
f=open(r'C:\python36\python学习内容\a',mode='rt',encoding='utf-8')
print(f)
x=10
都是变量
但是x=10会申请内存空间,把10存进去
f也会申请内存空间,把值放进去。先占应用程序的内存空间
open会有一个返回值,就是一个文件对象
区别就是 open这个值 不是独立存在的 它对应操作系统打开的一个文件 占的是应用程序的空间
拿到文件对象是为了对操作系统那个打开的文件下发指令
因此这步操作占两方面资源 应用程序占一个 操作系统占一个
open是应用程序向操作系统发请求,打开文件。首先占用操作系统,映射成硬盘空间。
r代表原生字符串,用绝对路径时候要记得
mode是打开模式
2.读/写文件
deta=f.read()
文件当初保存在内存上是以字符的形式存的,用的是Unicode和utf-8,硬盘上是二进制
Windows系统默认gbk解码,因此第三个参数是encoding
f.write()
3.关闭文件
虽然python自带内存管理,操作系统打开的文件还没回收
f.close() #向操作系统发送指令,让操作系统关闭打开的文件,回收操作系统资源
print(f) 因此这里打印f还是有f的值
f.read() 会报错,因为文件已经关闭,因此读写操作要在关闭操作系统之前操作
4.上下文管理:
with open('a',mode='rt',encoding='utf-8') as f ,\
open('a',mode='rt',encoding='utf-8'):
可以打开多个文件
data=f.read()
print(data)
子代码块运行完,会自动调 f.close
三、文件的打开模式基本介绍:
(一)、控制文件操作的格式
r 只能读 (后面默认t)
w 只能写
a 只写,追加写
(二)、控制文件读写内容的模式(不能单独使用,必须和r/w/a连用)
t (默认)文本模式 以字节为单位,都是字符串数据类型
b 以二进制为单位
四、文件的打开模式详细介绍:
(一)、控制文件操作的格式
r:只读模式,以该模式打开文件,当文件不存在时会报错,当文件存在时指针在文件开头
print(f.readable) True
print(f.writable) False
w: 只写模式,以该模式打开文件,当文件不存在时会创建一个空文档,当文件存在时文件内容清空
无论存不存在,指针都在文件开头。
也就是说:w模式下,无论文件存不存在,都会创建一个新文档覆盖原文档
with open('a',mode='w',encoding='utf-8')as f:
print(f.readable) False
print(f.writable) True
f.write('hhhhhhh')
f.write('xxxxx')
在打开文件不关的情况下,连续写入,新写的内容总是跟在老内容之后,类似追加
想要换行的话加\n(\r代表跳到行首),\n有跨平台性
lines=['111\n','222\n']
for line in lines:
f.write(line)
f.write可以写多行
lines=['111\n','222\n']
f.writelines(lines)
代替的就是for循环写多行
以上是wt,如果wb的话就不需要加encoding
如果是文本文件的话,写进去的都是字符,需要自己encode一下。
所以如果写文本文件的话,用t模式
with open('a',mode='wb',encoding='utf-8')as f:
f.write('hhhhh'.encode('utf-8'))
a: 只追加写模式,以该模式打开文件,当文件不存在时创建一个空文档,当文件存在时不清空文件内容,文件指针跳到文件末尾
(二)、控制文件读写内容的模式
t: 无论读写,都是以字符为单位的,都是字符串类型,只能操作文本文件
with open('a',mode='rt',encoding='utf-8') as f:
data=f.read()
print(data)
硬盘存在的是二进制,只读会把二进制读到python内存里,所以会报错。
t模式针对文本文件会解码,必须指定encoding参数】
line=f.readline()
print(line,end='')
一行一行读文件内容,第二次读的时候,指针在第二行开头
f.read不能轻易使用,是把文件内容全读到内存里面,文件过大的时候只能一行一行读f.readline
循环读文件内容:
for line in f:
print(line)
line=f.readlines()
print(line,end='')
和read类似,是把文件内容全读到内存里面,读成列表的形式。
b:读出来的是以bytes为单位的,可以操作所有文件,一定不能指定encoding参数
with open('a',mode='rt',encoding=’utf-8') as f:
data=f.read()
print(data)
这样的话也会报错,显示b模式不需要指定encoding,硬盘存什么样,就读什么样。
看到b,就想到二进制
操作文本文件的话,要自己进行解码操作。所以针对文本文件的话,采用t模式
了解:
+:不能单独使用,必须与r/w/a连用,
r+,w+,a+ 代表了可读可写
with open('a.txt','r+t',encoding='utf-8') as f:
print(f.readable()) True
print(f.writable()) True
data=f.readline()
print(data)
f.write('HHHHHHHHH')
五、修改文件的两种方式:
文件对应的都是硬盘空间,不能直接改,都是新的覆盖旧的
with open('a.txt','r+t',encoding='utf-8') as f:
了解:f.seek(9) #默认参照文件开头,移动9个bytes
f.write('你好啊')
在第九个bytes加上你好啊
方式一:
1. 以读的方式打开源文件
2. 将文件内容一次性全读入内存,在内存完成修改
3. 以写的方式打开源文件,然后将修改后的结果一次性写入源文件
总结:
优点:在文件修改过程中硬盘只存在一份数据
缺点:浪费内存
方式二:
1. 以读的方式打开源文件,以写的方式打开一个临时文件
2. 读取源文件的一行内容到内存中,将修改的结果写入临时文件,循环往复直到改
3. 删除源文件,将临时文件重命名为源文件名
优点:同一时间在内存中只有文件的一行内容,更节省内容
缺点:在文件修改过程中硬盘只存在两份数据
import os #模块概念
with open('b.txt',mode='rt',encoding='utf-8') as read_f,\
open('.b.txt.swap',mode='wt',encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('大SB','alex'))
os.remove('b.txt')
os.rename('.b.txt.swap','b.txt')