文件操作
一、什么是文件
- 文件就是应用程序等在运行过程中,产生的数据在操作系统中的虚拟概念
- 我们需要将这些数据文件保存到硬盘中,要通过操作系统完成对系统内存和硬盘的操作
二、文件操作的进本流程
- 我们在使用
open()
操作时要依次填入(‘文件名’,'读写方式','编码格式')
# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f = open('01', 'r', encoding='utf-8')
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data = f.read()
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()
三、文件操作中的资源回收
-
打开一个文件是我们需要占用两份资源一个是f变量和我们打开的那个文件的资源
-
为了节省资源我们需要把这两个全部回收了
f.close() # 回收操作系统打开的文件资源 del f # 回收应用的程序级变量
-
其中del f一定要发生在
f.close()
之后- 否则就会导致操作系统打开的文件无法关闭,白白占用资源
-
python为我们提供了自动的垃圾回收机制我们就不需要考虑
del f
这一步了 -
而且
f.close()
我们也可以通过with关键字来帮我们管理。
# 1、在执行完子代码块后,with 会自动执行f.close()
with open('a.txt','w') as f:
pass
# 2、可用用with同时打开多个文件,用逗号分隔开即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data = read_f.read()
write_f.write(data)
四、文件的操作模式
[1]有哪几种模式?
- (r)只读模式
- (w)只写模式
- (a)只追加写模式
[2]只读模式(a)
- r只读模式: 在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
with open('a.txt',mode='r',encoding='utf-8') as f:
res=f.read() # 会将文件的内容由硬盘全部读入内存,赋值给res
- 当路径中可能存在有转义的字符时,字符串前面加上r来解决转义的问题
r'D:\a.txt'
[3]只写模式(w)
- w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件,文件指针跑到文件开头
with open('b.txt',mode='w',encoding='utf-8') as f:
f.write('你好\n')
f.write('我好\n')
f.write('大家好\n')
f.write('my name is Xanadu')
- 强调
- 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
- 如果重新以w模式打开文件,则会清空文件内容
[4]只追加写模式(a)
- a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open('02', 'a', encoding='utf-8') as f:
f.write("my age is 20")
- 强调 w 模式与 a 模式的异同
- 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
- 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
五、控制文件读写内容的模式
- 文件读写的内容一般分为二进制的内容和文本的内容
[1](默认模式)文本模式(t)
- 读写文件都是字符串类型
- 只针对文本文件
- 需要规定转码表(encoding)参数
- 手动创建一个文本文件,输入几个字母
# t 模式 可以读出文本中的内容
with open('01', 'rt', encoding='utf8') as fp:
print(fp.read()) # Xanadu bridge water farm
print(type(fp.read())) # <class 'str'>
# t模式下 写入只能写入字符串
with open('01', 'at', encoding='utf8') as fp:
fp.write(" road")
- 强调:t 模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,当指定 t 模式时,内部帮我们做了编码与解码
[2]二进制模式(b)
- 读写文件都是以bytes/二进制为单位的
- 可针对所以文件
- 不能指定encoding参数
# b模式下所以读写内容都是二进制
with open('01', 'rb') as fp:
data = fp.read()
# b'Xanadu bridge water farm road' 读到的结果看起像字符串,这是因为默认的字符编码utf8中英文单词就是这样
print(data)
with open('01', 'ab') as fp:
fp.write(b'wind')
- 强调:b模式对比t模式
- 在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
- 针对非文本文件(如图片、视频、音频等)只能使用b模式
[强调]
- tb模式均不能单独使用,必须与r/w/a之一结合使用
六、文操作方法(细分)
[1]读操作
- read()
# read方法是将整个文件全部读完,结束后光标会移动到文件末尾
with open('02', 'r', encoding='utf8') as fp:
print(fp.read())
'''
my name is Xanadu
my age is 20
my numbering is 666
'''
- readline()
#readline 就像字面意思,读一行内容,然后光标移到第二行首部
with open('02', 'r', encoding='utf8') as fp:
print(fp.readline())
print(fp.readline())
'''
my name is Xanadu
my age is 20
'''
#如果连续多行readline(),之间会有换行符隔开
- readlines()
#读取每一行的内容,然后放入列表
with open('02', 'r', encoding='utf8') as fp:
print(fp.readlines())
'''
['my name is Xanadu\n', 'my age is 20\n', 'my numbering is 666']
'''
[2]写操作
- write()
# write 能写入单行的字符串,换行需要自己输入换行符
with open('02', 'a', encoding='utf8') as fp:
fp.write('\nmy height is 177.5')
- writelines()
# write 可以写入多个字符串
with open('02', 'a', encoding='utf8') as fp:
fp.writelines(['\nmy height is 177.5', '\nmy hobby is music'])
[3]判断文件是否可读可写可关闭
- .readable() 文件是否可读
- .writable() 文件是否可写
- .closed() 文件是否关闭
- encoding 如果文件打开模式为b,则没有该属性
- .flush 立刻将文件内容从内存刷到硬盘
- .name 获取文件的名字
with open('01', 'r', encoding='utf8') as fp:
print(fp.readable()) # True 返回True可读
print(fp.writable()) # False 返回False不可写
print(fp.closed) # False 返回False程序正在运行中,没有关闭
print(fp.encoding) # utf8 返回编码表
fp.flush()
print(fp.closed) # True #程序结束后自然就会关闭返回 True
七、主动控制文件内指针的移动
[1]f.seek()
方法的介绍
-
注意:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位
-
我们使用
f.seek()
方法来控制文件内指针的移动- 格式
f.seek
(指针移动的字节数,模式控制)
- 格式
-
模式我们分三种:0模式,1模式,2模式
[2]0模式
- 0模式是默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
with open('03', 'rt', encoding='utf8') as fp:
fp.seek(3, 0)
print(fp.tell()) #.tell()函数可以当前指针距离文件头的位置
print(fp.read())
'''
3
DEFGHIJKLMN
'''
[3]1模式
- 该模式代表指针移动的字节数是以当前所在的位置为参照的
with open('03', 'rb') as fp:
fp.seek(3, 1)
print(fp.tell())
fp.seek(3, 1)
print(fp.tell())
print(fp.read())
'''
3
6
b'GHIJKLMN'
'''
[4]2模式
- 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
with open('03', 'rb') as fp:
fp.seek(0,2)
print(fp.tell())
fp.seek(-5,2)
print(fp.tell())
print(fp.read())
'''
14
9
b'JKLMN'
'''
标签:fp,文件,encoding,模式,print,操作,open
From: https://www.cnblogs.com/taoyuanshi/p/17880349.html