文件操作
1.书写方式
f = open('数据类型练习.py','r',encoding='utf8')
content = f.read()
print(content)
f.close()
# 要打开的文件格式一定要书写正确,注意是否需要添加后缀
上述代码各个部分解释:
f: 就是一个变量,称作文件句柄。
open:是Python调用的操作系统(windows,linux,等)的功能。
'数据类型练习.py': 这个是文件的路径。
mode: 就是定义你的操作方式:r为读模式。
encoding: 不是具体的编码或者解码,他就是声明:此次打开文件使用什么编码本。一般来说:你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8(有些使用的是gbk)。
f.read():你想操作文件,比如读文件,给文件写内容,等等,都必须通过文件句柄进行操作。
close(): 关闭文件句柄(可以把文件句柄理解成一个空间,这个空间存在内存中,必须要主动关闭)。
2.路径注意
-
路径中存在其它特殊符号,使得地址意义发生改变 例: 'D:最新学习资料 d.txt'
-
解决方法
- 在发生意义改变的符号前面加
\
来抑制转义 - 或者路径整体前面添加r,
r'D:最新学习资料 d.txt'
- 在发生意义改变的符号前面加
-
相对路径
- 从磁盘根目录开始
-
绝对路径
- 上一层文件夹用
../
- 上一层文件夹用
3.文件操作
r模式
-
read() 一次全部读取出来,文件大会非常占内存
-
read(n) n表示字符,☞读到什么位置
-
readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个
- 解决方法:在读取出来的数据后面添加.strip()
-
readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。
f = open('log',encoding='utf-8') print(f.readlines()) f.close() # 结果['666666 ', 'fkja l; ', 'fdkslfaj ', 'dfsflj ', 'df;asdlf ', ' ', ]
-
for循环(最最常用的)
- 文件句柄是一个迭代器,特点每次循环只在内存中占一行的数据,非常节省内存
f = open('../path1/弟子规',mode='r',encoding='utf-8') for line in f: print(line) f.close()
rb模式
- 以二进制格式打开一个文件用于只读,主要是操作非文字文件:图片,音频,视频等,并且如果你要是带有b的模式操作文件,那么不用声明编码方式。
- read read(n) readline(),readlines() for循环这几种方法
4.写
- w模式
- 文件不存在,是先创建,然后写内容
- 文件存在,先清空原文件内容,再写入新内容
- wb模式
- 文件不存在,是先创建,然后写内容
- 文件存在,先清空原文件内容,再写入新内容
5.追加
- a
注意
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
文件操作的其它操作
read(n)
- 文件打开方式为文本模式时,代表读取n个字符
2. 文件打开方式为b模式时,代表读取n个字节
seek()
-
seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
-
通常我们使用seek都是移动到开头或者结尾
-
移动到开头:seek(0)
-
移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close()
tell()
使用tell()可以帮我们获取当前光标在什么位置
最最常用文本打开操作
- with open() as ...
- 好处:
- 自动关闭文件句柄
- 好处:
# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
with open('t1',encoding='utf-8') as f1:
f1.read()
# 2,一个with 语句可以操作多个文件,产生多个文件句柄。
with open('t1',encoding='utf-8') as f1,
open('Test', encoding='utf-8', mode = 'w') as f2:
f1.read()
f2.write('老男孩老男孩')
r+模式!!!
-
读写度模式
##xxoo 文本内容 abcd qwer sdf sidh sdjf 小明 666#执行完显示
with open('xxoo','r+',encoding='gbk') as f: print('--第一次读取-->>',f.readline()) f.write(' 小明 666') print("--->>>",f.readline()) #--第一次读取-->> abcd --->>> #读的时候光标在初始位置0开始读, #写的时再末尾添加,此时光标在尾部 #再次读,从光标尾部读
-
先写后读
with open('xxoo','r+',encoding='gbk') as f: f.write('小明 666') print(f.read()) 结果: r sdf sidh sdjf ## 先做写操作,写的内容默认从初始位置0开始写,会覆盖掉原来的数据,写完后光标再写的后面 #再读的时候从光标位置读
a+模式
无论是先读还是先写,光标都是再末尾。。。