文件的来源
什么是文件
文件是操作系统提供给用户/应用程序的一种虚拟单位,该虚拟单位直接映射到硬盘空间。
处理文件
用户/应用程序直接操作文件(读/写)就被操作系统转换成具体的硬盘操作,从而实现用户/应用程序将内存中的数据永久保存在硬盘中。
python处理文件的三个步骤
- 打开文件,得到文件句柄并赋值给一个变量
f=open('test.txt','r',encoding='utf-8')
- 通过句柄(f)对文件进行操作
data=f.read()
- 关闭文件
f.close()
f=open('test.txt','r',encoding='utf-8')过程分析
_.由应用程序向操作系统发起系统调用open()
_.操作系统打开该文件,并返回一个文件句柄给应用程序(python解释器)
_.应用程序将文件句柄赋值给变量f
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序获得的句柄变量。在操作完一个文件时,必须把与该文件的这两部分资源全部回收,为了防止忘记回收,python引入了上下文管理机制。
with open()
语句会自动帮你回收资源
打开文件时因为只能由操作系统操作,所以打开文件的默认编码会是操作系统的编码,在windows下是gbk,在linux中是utf-8,所以为了不乱码,文件以什么编码存储的,那么就用什么编码打开。
文件操作rtb模式
python处理文件分为两种,分别为打开模式和操作文件内容模式,打开模式默认为r
文件打开模式
以r模式打开文件
with open(r'test.txt',mode='r',encoding='utf-8') as read_f:
f.read()
f.readline()
f.readlines()
f.readable()
当以r模式打开文件时,获得的文件句柄主要有四个方法。
f.read()
读取所有内容,光标移动到文件末尾f.readline
读取一行内容,光标移动到第二行行首位置f.readlines()
读取每一行内容,存放在列表中f.readable()
判断文件是否可读
以w模式打开文件
with open(r'test.txt',mode='w',encoding='utf-8') as f:
f.write()
f.writelines()
f.writeable()
当以w模式打开文件时,获得的文件句柄主要有三个方法。
f.write()
将内容写入文件f.writelines()
一次写入多行内容f.writeable
判断文件是否可写
以a模式打开文件
with open('test.txt',mode='a',encoding='utf-8') as f:
f.write()
f.writelines()
1. `f.write()`
将内容追加到文件末尾
2. `f.writelines()`
将多行内容追加到文件末尾
# 操作文件内容的格式
## 打开文件的模式(默认为文本模式)
**r,只读模式【默认模式,文件必须存在,不存在则会抛出异常】**
**w,只写模式【不可读;不存在则创建新文件;存在则清空内容】**
**a,追加写模式【不可读;不存在则创建新文件;存在则只追加内容】**
## 对于非文本文件,我们只能用使用b模式,'b'表示以字节的方式操作(而所有文件都是以字节的形式存储的,使用'b'模式无需考虑文件的字符编码)
**注意:以b方式打开文件时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码**
## 其他模式
**"+" 表示可以同时读写某个文件**
**r+, 读写【可读,可写】**
**w+,写读【可读,可写】**
**a+, 写读【可读,可写】**
**x, 只写模式【不可读;不存在则创建,存在则报错】**
**x+ ,写读【可读,可写】**
# 文件内指针移动
## 一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
## 二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
# 文件的修改
**文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,原理是把硬盘中的文件读入内存,在内存中修改完后,覆盖原来的内容。具体的说有两种实现方式:**
## 方式一:
**将硬盘存放该文件的内容全部加载到内存,修改完毕后,再由内存覆盖到硬盘中**
import os
with open('test.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡
data=data.replace(') #在内存中完成修改
write_f.write(data) #一次性写入新文件
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
## 方式二:
**将硬盘存放的文件一行一行读入到内存,修改完毕后就写入新文件,最后用新文件覆盖源文件**
import os
with open('test.txt') as read_f,open('.test.txt.swap','w') as write_f:
for line in read_f:
line = line.replace()
write_f.write(line)
os.remove('test.txt')
os.rename('.test.txt.swap','test.txt')