使用Python来读写文件是非常简单的操作,使用open()来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作
根据打开方式的不同能够执行的操作会有相应的差异.
打开文件的方式:
-
r,w,a
-
rb,wb,ab
-
r+,w+,a+
-
r+b,w+b,a+b
一. 读操作
1.1 r模式
我们先来看看这个只读操作,听名字应该也知道只能进行读不能进行别的操作
f = open('联系方式.txt',mode='r',encoding='utf-8')
content = f.read()
f.close()
open中第一个参数放入的是要打开的文件名字,第二个参数是要对这个文件进行的操作,第三参数是用什么编码方式打开文件中的内容
-
f 可写成任意变量等,它被称作:文件句柄,文件操作符,或者文件操作对象等
-
open 是Python调用操作系统的功能,windows的默认编码方式为gbk,linux默认编码方式为utf-8,所以你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8
-
mode为打开方式,默认不写是r。 流程就是打开文件,产生一个文件句柄,对文件句柄进行相应操作
1.2 rb 模式
再看看rb只读字节的模式
f = open('联系方式.txt',mode='rb')
content = f.read()
print(content)
f.close()
结果:
b'\xe6\xa0\x87\xe9\xa2\x98\xe5\xbe\x88\xe5\xa5\xbd'
rb 读出来的数据是bytes类型,在rb模式下,不能指定encoding
rb的作用:
-
在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的
-
这个字节的模式是用于传输和存储
对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+
1.3 r+模式
看下正确的操作:
f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
msg = f1.read()
f1.write('这支烟灭了以后')
f1.flush()
f1.close()
结果:
正常的读取之后,写在结尾
看下错误的操作:
f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()
结果:
这样写会把小鬼写在开头,并且读出来的是小鬼之后的内容
r+模式一定要记住是先读后写
r+模式深坑请注意:
- 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入或者操作文件的时候都是在结尾进行的操作
r+b模式与r+模式相似
二. 写操作
2.1 w模式
在写文件的时候我们要养成一个写完文件就刷新的习惯:刷新flush()
f = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
f.write('太白很白')
f.flush()
f.close()
注意: 如果文件不存在,使用w模式会创建文件,文件存在,w模式是覆盖写,在打开文件时会把文件中所有的内容清空
尝试读一读:
f1 = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
msg = f1.read()
print(msg)
结果:
Traceback (most recent call last):
File "D:/python_object/path2/test.py", line 563, in <module>
msg = f1.read()
io.UnsupportedOperation: not readable #模式是w,不可以执行读操作
2.2 wb模式
wb模式下,不可以指定打开文件的编码方式,但是写文件的时候必须将字符串转换成utf-8的bytes数据
f = open('../path1/小娃娃.txt',mode='wb')
msg = '你好'.encode('utf-8')
f.write(msg)
f.flush() # 刷新
f.close()
2.3 w+模式
先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用
f1 = open('../path1/小娃娃.txt',mode='w+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()
print(msg)
w+b模式与w+模式相似
三. 写读模式
3.1 a模式
不论光标在何位置,在a追加模式下,写入的内容都追加在文件的末尾
a模式如果文件不存在就会创建一个新文件
f1 = open('../path1/小娃娃.txt',mode='a',encoding='utf-8')
msg = f1.write('这支烟灭了以后')
ab这个模式与a相似
3.2 a+追加读
a+模式下,不论是先读还是后读,都是读不到数据的
f = open('../path1/小娃娃.txt',mode='a+',encoding='utf-8')
f.write('阿刁')
f.flush()
msg = f.read()
f.close()
print(msg)
a+b模式与a+模式相似
四. 其他相关操作
4.1 文件路径
绝对路径:从根目录下开始一直到文件名
相对路径:同一个文件夹下面的文件,直接写文件名就可以
我们在使用绝对路径的时候因为有\,这样程序是不能识别的,解决方法:
open('C:\Users\Meet') #这样程序是不识别的
解决方法一:
open('C:\\Users\\Meet') #这样就成功的将\进行转义 两个\\代表一个\
解决方法二:
open(r'C:\Users\Meet') #这样相比上边的还要省事,在字符串的前面加个小r也是转义的意思 推荐使用这种
更推荐大家使用相对路劲,因为我把这个程序的整个文件发给你的时候,就可以运行,如果使用绝对路径还需要额外的拷贝外部文件给你
4.2 seek()
seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
通常我们使用seek都是移动到开头或者结尾
移动到开头:seek(0,0)
移动到当前位置:seek(0,1)
移动到末尾:seek(0,2)
移动1个字:seek(3) 移动光标是按照字节进行移动
f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close()
4.3 tell()
使用tell()可以帮我们获取当前光标在什么位置
f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中⽂文3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()
4.4 修改文件
文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字
import os
with open("../path1/小娃娃", mode="r", encoding="utf-8") as f1,\ #with open会自动关闭文件
open("../path1/小娃娃_new", mode="w", encoding="UTF-8") as f2:
content = f1.read()
new_content = content.replace("冰糖葫芦", "⼤白梨")
f2.write(new_content)
os.remove("../path1/小娃娃") # 删除源文件
os.rename("../path1/小娃娃_new", "小娃娃") # 重命名新文件
弊端: ⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作
import os
with open("小娃娃", mode="r", encoding="utf-8") as f1,\
open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
new_line = line.replace("大白梨", "冰糖葫芦")
f2.write(new_line)
os.remove("小娃娃") # 删除源⽂文件
os.rename("小娃娃_new", "小娃娃") # 重命名新文件
4.5 打开文件open
我们都知道打开文件有两种方法:
- f = open()
- with open() as f:
这两种方法的区别就是第一种方法需要我们自己关闭文件;f.close(),而第二种方法不需要我们自己关闭文件,无论是否出现异常,with都会自动帮助我们关闭文件
标签:文件,utf,f1,读写,模式,mode,open From: https://www.cnblogs.com/vahan/p/16867283.html