目录
文件操作
文件的概念
操作系统暴露给用户操作硬盘的快捷方式
eg:双击一个文件 其实是从硬盘将数据加载到内存
ctrl+s保存文件 其实是将内存中的数据刷到硬盘保存
打开文件的两种方式
方式1:
f = open(文件路径,读写模式,encoding='utf8')
f.close()
方式2:
with open('a.txt', 'r', encoding='utf8') as f1:
with子代码块
ps:with上下文管理好处在于子代码运行结束自动调用close方法关闭资源
补充
"""
open方法的第一个参数是文件路径 并且撬棍跟一些字母的组合会产生特殊的含义导致路径查找混乱 为了解决该问题可以在字符串的路径前面加字母r
D:\a\n\t
r'D:\a\n\t'
以后涉及到路径的编写 推荐加上r
with支持一次性打开多个文件
with open() as f1,open() as f2,open() as f3:
子代码
"""
文件读写模式
r模式
'r' 只读模式:只能读不能写
# 1.文件路径不存在:会直接报错
with open(r'b.txt','r',encoding='utf8') as f:
print(f.read())
# 2.文件路径存在:正常读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read())
w模式
'w' 只写模式:只能写不能看
# 1.文件路径不存在:自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
# 2.文件路径存在:先清空文件内容 之后再写入
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('赶紧学习吧\n')
f.write('赶紧学习吧\n')
f.write('赶紧学习吧\n')
'''强调:换行符需要自己添加 并且在后续数据读取比对的时候也一定要注意它的存在'''
a模式
'a' 只追加模式:文件末尾添加数据
# 1.文件路径不存在:自动创建
with open(r'c.txt', 'a', encoding='utf8') as f:
pass
# 2.文件路径存在:a模式不会先清空该文件内容 自动在末尾等待追加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('阿巴阿巴\n')
注意:
"""
当我们在编写代码的时候 有些部分不知道写什么具体代码 但是也不能空着不写
这个时候可以使用关键字
pass
...
只补全语法不执行功能 本身没有任何的含义
"""
w模式和a模式异同
相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
以a模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
文件操作模式
t模式
t 文本模式
默认的模式 我们上面所写的r w a其实全称是 rt wt at
- 1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定encoding参数 如果不知道则会采用计算机默认的编码
b模式
b 二进制模式(bytes模式)
不是默认的模式 需要自己指定 rb wb ab(不能省略b)
1.可以操作任意类型的文件
2.读写都是以bytes为单位
3.不需要指定encoding参数 因为它已经是二进制模式了 不需要编码
注意:二进制模式与文本模式针对文件路径是否存在的情况下 规律是一样的!!!
b模式对比t模式
1.纯文本文件:t模式省去编码和解码的环节,b模式需要手动编码和解码,t模式更方便
2.非文本文件(图片、视频、音频):只能使用b模式
3.t/b模式都不可以单独使用,必须与r/w/a之一结合使用
文件的诸多操作方法
1.read()
一次性读取文件内容 并且光标停留在文件末尾 继续读取则没有内容
并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出
括号内还可以填写数字 在文本模式下 表示读取几个字符
2.for循环
一行行读取文件内容 避免内存溢出现象的产生
3.readline()
一次只读一行内容
4.readlines()
一次性读取文件内容 会按照行数组织成列表的一个个数据值
5.readable()
判断文件是否具备读数据的能力
6.write()
写入数据
7.writeable()
判断文件是否具备写数据的能力
8.writelines()
接收一个列表 一次性将列表中所有的数据值写入
9.flush()
将内存中文件数据立刻刷到硬盘 等价于ctrl + s
文件内光标的移动
文本模式
文本模式:read()括号内的数字表示读取几个字符
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read(3)
print(data)
二进制模式:read()括号内的数字表示读取及格字节(英文1字节,中文3字节)
with open(r'a.txt', 'rb') as f:
data = f.read(3)
print(data.decode('utf8'))
tell方法
.tell():获取光标移动的字节数 # 返回光标距离文件开头产生的字节数
seek方法
之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则需要用seek方法主动控制文件内指针的移动
.seek(offset,whence)
offset:指针移动的字节数 是位移量 以字节为单位
whence:模式控制
0模式(默认模式):基于文件开头移动的多少字节
1模式:基于光标当前所在位置移动多少字节(只能在二进制模式(b模式)下使用)
2模式:基于文件末尾移动多少字节(只能在二进制模式(b模式)下使用)
0模式详解:
# a.txt用utf-8编码,内容如下(abc各占1个字节,中文“你好”各占3个字节)
abc你好
# 0模式的使用
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0) # 参照文件开头移动了3个字节
print(f.tell()) # 查看当前文件指针距离文件开头的位置,输出结果为3
print(f.read()) # 从第3个字节的位置读到文件末尾,输出结果为:你好
# 注意:由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败
with open('a.txt',mode='rb') as f:
f.seek(6,0)
print(f.read().decode('utf-8')) #输出结果为: 好
1模式详解:
# 1模式的使用
with open('a.txt',mode='rb') as f:
f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
print(f.tell()) # 输出结果为:3
f.seek(4,1) # 从当前位置往后移动4个字节,而此时的当前位置为3
print(f.tell()) # 输出结果为:7
2模式详解:
# a.txt用utf-8编码,内容如下(abc各占1个字节,中文“你好”各占3个字节)
abc你好
# 2模式的使用
with open('a.txt',mode='rb') as f:
f.seek(0,2) # 参照文件末尾移动0个字节, 即直接跳到文件末尾
print(f.tell()) # 输出结果为:9
f.seek(-3,2) # 参照文件末尾往前移动了3个字节
print(f.read().decode('utf-8')) # 输出结果为:好
标签:文件,字节,encoding,模式,操作,txt,open
From: https://www.cnblogs.com/wxlxl/p/16770357.html