文章目录
- 创建文件句柄
- 操作模式
- 常用方法
- 读文件
- 写文件
- 光标的使用
- 用于容错判断
- 示例 - 修改文件
创建文件句柄
'''
1. open是操作系统的指令
2. 文件路径: xx/xx/xx.txt, 可以使用绝对路径或者相对路径, 路径中出现反斜杠会报错, 推荐在引号前加r(全部转义)
3. 打开编码方式: 跟随系统, windows默认编码是gbk, linux和mac默认编码是utf-8
4. 动作: 读/写/追加, mode默认模式为r(只读模式)
5. 文件句柄常用命名: f1 / file / f_handle / file_handle / f_obj
'''
# 方式 1, 推荐, 不需要手动关闭
with open("xx/xx.txt", encoding="utf-8", mode="r") as f:
# do sth. # 操作
# 方式 2
f1 = open('xx/xx/xx.txt', encoding='utf-8', mode='r')
# do sth. # 操作文件句柄
f1.close() # 关闭文件句柄
操作模式
参数 | 描述 |
r / rb | 只读 |
w / wb | 只写 |
a / ab | 追加 |
r+ / r+b | 先读后追加, 避免使用 |
w+ / w+b | 先写后读, 避免使用 |
a+ / a+b | 避免使用 |
- r 模式 (只读)
''' 原文件: utf-8编码的"中国" '''
with open("a.txt", "r", encoding="utf-8") as f:
print(f.read()) # 中国
- rb 模式 (不做编码转化的只读, 一般用于操作非文字类文件, encoding参数可以不写)
''' 原文件: utf-8编码的"中国" '''
with open("a.txt", "rb") as f:
print(f.read()) # b'\xe4\xb8\xad\xe5\x9b\xbd
- w 模式
'''
1. 若文件不存在, 则创建文件, 并写入内容
2. 若文件存在, 则清空文件内容, 并写入内容
'''
with open("c.txt", encoding="utf-8", mode="w") as f:
s = "写入内容"
f.write(s)
- wb 模式
''' 写入 bytes 格式的文件, 常用于写入图片等非文本文件 '''
with open("b.txt", mode="wb") as f:
s = "写入内容"
# 使用 utf-8 编码, 将 str 转为 bytes 类型
content = s.encode("utf-8")
# content = s.encode("gbk") # 使用 gbk 编码的 bytes 类型写入, 在默认解码为 utf-8 的时候会显示乱码
f.write(content)
- a 模式
'''
1. 若文件不存在, 则创建文件, 并写入内容
2. 若文件存在, 则直接在文件末尾写入内容
'''
with open("c.txt", encoding="utf-8", mode="a") as f:
s = "写入内容"
f.write(s))
- ab 模式
''' 追加 bytes 格式的文件 '''
with open("c.txt", mode="ab") as f:
s = "写入内容 2"
# content = s.encode("utf-8")
content = s.encode("gbk") # 使用 gbk 编码的 bytes 类型写入, 在默认解码为 utf-8 的时候会显示乱码
f.write(content)
常用方法
读文件
- for 循环 - 逐行读, 末尾自动退出
''' 读到末尾自动退出 '''
with open("a.txt", "r", encoding="utf-8") as f:
for i in f:
print(i)
- read() - 读全文
"""
不传参, 读取全文
传参, 如果是 r 模式, 最小元素为字符, 如果是 rb 模式, 最小元素为字节
"""
with open("a.txt", "r", encoding="utf-8") as f:
# 读全文
print(f.read())
# 按最小元素读取
print(f.read(10))
- readline() - 逐行读, 末尾持续返回空行
''' 一行一行读, 从第一行开始, 不会自动停止 '''
with open("a.txt", "r", encoding="utf-8") as f:
print(f.readline())
print(f.readline()) # 末尾之后会返回空行
- readlines() - 不推荐使用, 可能导致内存溢出
'''
读取全文, 每一行内容作为列表的一个元素, 可能导致内存溢出, 不推荐使用
readlines可以设定读取的最大字节大小 readlines(sizehint)
'''
with open("a.txt", "r", encoding="utf-8") as f:
print(f.readlines())
写文件
- write() - 全部写入
"""
全部文本写入
可写单行, 可写多行
"""
s = """fajdifopajeipafeajfpoa
wjeifopajefi
ajfiep
附件eipafeifoj
"""
with open("b.txt", mode="w") as f:
f.write(s)
- writeline() - iterable 写入
""" 将 iterable 依次写入 """
# 创建一个可迭代对象
s = [str(i) for i in range(30)]
with open("b.txt", mode="w") as f:
f.writelines(s)
- flush() - 立即写入, 刷新缓冲区
"""
刷新缓冲区,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用该方法。
"""
import sys, time
for i in range(10):
sys.stdout.write("*")
sys.stdout.flush()
time.sleep(0.2)
光标的使用
""" 文件内容: content """
with open("c.txt", mode="r") as f:
# 光标后移 3 位, 换行符也算 1 位
f.seek(3)
# 获取光标当前位置
f.tell()
# 读取内容
print(f.read()) # tent
# 将光标移到最前
f.seek(0, 0)
print(f.read()) # content
# 将光标移到末尾
f.seek(0, 2)
print(f.read()) # "", 空字符串
用于容错判断
# 是否可读
f.readable()
# 是否可写
f.writable()
# 光标是否可操作
f.seekable()
示例 - 修改文件
import os
''' 方法1, 用for语句逐行读取内容, 不会占用过大内存, 推荐使用 '''
# 1. 打开两个文件句柄
with open("xx.txt",encode="utf-8",mode="r") as f1, open("xx.bak",encode="utf-8",mode="w") as f2:
# 2. for 循环遍历旧文件
for i in f1:
# 3. 将旧文件中需要修改的地方替换
new_content = i.replace("old_str", "new_str")
# 4. 将替换好的文本写入新文件
f2.write(new_content)
# 5. 删除旧文件
os.remove('xx.txt')
# 6. 将新文件命名为旧文件
os.rename('xx.bak', 'xx.txt')