1. 语法:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
1 file: 必需,文件路径(相对或者绝对路径)。
2 mode: 可选,文件打开模式
3 buffering: 设置缓冲
4 encoding: 一般使用utf8
5 errors: 报错级别
6 newline: 区分换行符
7 closefd: 传入的file参数类型
8 opener:
mode 参数有:
模式 |
描述 |
---|---|
t |
文本模式 (默认)。 |
x |
写模式,新建一个文件,如果该文件已存在则会报错。 |
b |
二进制模式。 |
+ |
打开一个文件进行更新(可读可写)。 |
U |
通用换行模式(Python 3 不支持)。 |
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w |
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
默认为文本模式,如果要以二进制模式打开,加上 b 。
2. 只读文件:
2.1 打开文件的方式:
r,w,a
r+,w+,a+
rb,wb,ab
r+b,w+b,a+b
2.2 r模式:
# 以只读的方式打开文件
f = open('demo.txt',mode='r',encoding='utf-8')
content = f.read()
print(content)
f.close()
"""
open中第一个参数放入的是要打开的文件名字,第二个参数是要对这个文件进行的操作,第三参数是用什么编码方式打开文件中的内容
f 可写成任意变量等,它被称作:文件句柄,文件操作符,或者文件操作对象等。
open 是Python调用的操作系统(windows,linux,等)的功能,而windows的默认编码方式为gbk,linux默认编码方式为utf-8,所以你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8。
mode为打开方式:常见的有r,w,a,r+,w+,a+.rb,wb,ab,等,默认不写是r。
流程就是打开文件,产生一个文件句柄,对文件句柄进行相应操作,关闭文件。
"""
2.3 rb 模式:
# 我们试了r只读,再看看rb只读字节的模式
f = open('3厘米.jpg',mode='rb')
content = f.read()
print(content)
f.close()
"""
rb 读出来的数据是bytes类型,在rb模式下,不能encoding字符集
rb的作用:在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的
这个字节的模式是用于传输和存储
好了,我们动手试一试.读文件吧,你们如果是在windows系统中用记事本创建的文件,在打开的时候会有问题,
是因为windows系统中记事本中写的内容编码是GBK我们要不将文件中编码改成utf-8 要不在open中第三个参数 中
修改成utf-8
"""
3. 读操作
3.1 read():
# read()是将文件中所有的内容都读取
print("read()是将文件中所有的内容都读取")
f = open('demo.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)
# read()可以指定我们想要读取的内容数量
print("read()可以指定我们想要读取的内容数量")
f = open('demo.txt',mode='r',encoding='utf-8')
msg = f.read(3) #读取三个字符
msg1 = f.read() #后边在读就会继续向后读取
f.close()
print(msg)
print(msg1)
# 上边现在使用的是r模式这样读取的就是文字,如果使用rb模式读取出来的就是字节
print("上边现在使用的是r模式这样读取的就是文字,如果使用rb模式读取出来的就是字节")
f = open('demo.txt',mode='rb')
msg = f.read(3)
msg1 = f.read()
f.close()
print(msg)
print(msg1)
3.2 readline():
# readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个
f = open('demo.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline()
msg3 = f.readline()
msg4 = f.readline()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)
# 结果这里每个一内容中间都有一个空行是因为咱们读取的内容后边都带有一个
print()的时候会将这个
执行
# 解决这个问题只需要在我们读取出来的文件后边加一个strip()就OK了
f = open('demo.txt',mode='r',encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
msg4 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)
3.3 readlines():
# readlines() 将每一行形成一个元素,放到一个列表中,将所以的内容全部读出来,如果文件很大,占内存,容易崩盘。
f = open('demo.txt',encoding='utf-8')
print(f.readlines())
f.close()
# 结['张飞
', '赵云
', '马超
', '刘备
', '孙尚香
', '小乔
', '曹操']
# 如果有个较大的文件我们进行读取不推荐使用以下方法:
f = open('demo.txt',mode='r',encoding='utf-8') # 此处的../是返回到父目录
print(f.read()) #这样就是将文件一次性全部读取到内存中,内存容易奔溃
# 推荐使用的是这种方法:
f = open('demo.txt',mode='r',encoding='utf-8')
for line in f:
print(line) #这种方式就是在一行一行的进行读取,它就执行了下边的功能
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
# 注意点:读完的文件句柄一定要关闭
4. 写模式
4.1 覆盖写:
# A: # 在写文件的时候我们要养成一个写完文件就刷新的习惯. 刷新flush() f = open('demo.txt',mode='w',encoding='utf-8') f.write('文件操作之-覆盖写') f.flush() f.close() # 注意点:如果文件不存在使用w模式会创建文件,文件存在w模式是覆盖写,在打开文件时会把文件中所有的内容清空. # B: # 这个是先查看文件中有哪些内容 f1 = open('demo.txt',mode='r',encoding='utf-8') msg = f1.read() print(msg) # 这个是对文件进行覆盖写操作 f = open('demo.txt',mode='w',encoding='utf-8') f.write('这个是对文件进行覆盖写操作') f.flush() f.close() # 查看覆盖写后的内容 f1 = open('demo.txt',mode='r',encoding='utf-8') msg = f1.read() print(msg) # D: # 尝试读一读 f1 = open('demo.txt',mode='w',encoding='utf-8') msg = f1.read() print(msg) # Traceback (most recent call last): # File "F:/资料/python相关/python 基础/实例/python3 文件操作/写模式/覆盖写.py", line 33, in <module> # msg = f1.read() # io.UnsupportedOperation: not readable 模式是w,不可以执行读操作 # E: # wb模式下,不可以指定打开文件的编辑,但是写文件的时候必须将字符串转换成utf-8的bytes数据 f = open('demo.txt',mode='wb') msg = '你好'.encode('utf-8') f.write(msg) f.flush() # 刷新 f.close()
4.2 追加:
""" # 追加 # 只要是a或者ab,a+都是在文件的末尾写入,不论光标在任何位置. # 在追加模式下,我们写入的内容后追加在文件的末尾 # a模式如果文件不存在就会创建一个新文件 """ f1 = open('demo.txt',mode='a',encoding='utf-8') msg = f1.write('这支烟灭了以后 ') # ab这个模式,自己试一下 没有什么太大的差别
5. 读写模式
5.1 r+模式:
# 对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+ # r+模式 # 看下正确的操作: f1 = open('demo.txt',mode='r+',encoding='utf-8') msg = f1.read() f1.write('这支烟灭了以后 ') f1.flush() f1.close() print(msg) # 看下错误的操作: f1 = open('demo.txt',mode='r+',encoding='utf-8') f1.write('小鬼') msg = f1.read() f1.flush() f1.close() print(msg) # r+模式一定要记住是先读后写 # r+模式坑 # 深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入 # 或者操作文件的时候都是在结尾进行的操作.
5.2 w+模式:
# 先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用 f1 = open('demo.txt',mode='w+',encoding='utf-8') f1.write('小鬼') msg = f1.read() f1.flush() f1.close() print(msg) # 有人说,先读在写不就行了.w+模式下 其实和w模式一样,把文件清空了,在写的内容.所以很少人用
6. 其他相关操作
6.1 seek():
# seek():
# seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
# 通常我们使用seek都是移动到开头或者结尾
# 移动到开头:seek(0,0) 可以看做成seek(0)
# seek(6)这种如果是单数并且不是0的就是按照字节来移动光标
# 移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
f = open("demo.txt", 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()
6.2 tell()
# tell(): # 使用tell()可以帮我们获取当前光标在什么位置 f = open("demo.txt", 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 print(f.tell()) # 光标位置9 f.flush() f.close()
6.3 truncate()
# truncate(): f = open("demo.txt", mode="w", encoding="utf-8") f.write("哈哈") # 写入两个字符 f.seek(3) # 光标移动到3, 也就是两个字中间 f.truncate() # 删掉光标后面的所有内容 f.close() f = open("demo.txt", mode="r+", encoding="utf-8") content = f.read(3) # 读取9个字符 f.seek(4) print(f.tell()) f.truncate() # 后面的所有内容全部都删掉 # print(content) f.flush() f.close() # 所以如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断 # 关于truncate(n), 如果给出了n. 则从开头进行截断, 如果不给n, 则从当前位置截断. 后面 # 的内容将会被删除
6.4 修改文件
# 文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字. import os with open("demo.txt", mode="r", encoding="utf-8") as f1, open("demo1.txt", mode="w", encoding="UTF-8") as f2: content = f1.read() new_content = content.replace("冰糖葫芦", "⼤白梨") f2.write(new_content) os.remove("demo.txt") # 删除源文件 os.rename("demo1.txt", "demo1.txt") # 重命名新文件 # 弊端: ⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作 """ import os with open("demo.txt", mode="r", encoding="utf-8") as f1, open("demo01.txt", mode="w", encoding="UTF-8") as f2: for line in f1: new_line = line.replace("大白梨", "冰糖葫芦") f2.write(new_line) os.remove("demo.txt") # 删除源⽂文件 os.rename("demo1.txt", "demo1.txt") # 重命名新文件 """