10.文件读写
大约 4 分钟学习笔记Python基础
文本文件的打开分为两种模式:**文本模式 ** 、二进制模式
通常,对 文本文件 都是以 文本模式 打开。程序读取 和 写入 的都是 字符串 对象。
一、 open 函数
1. open 函数的参数
open 函数的参数:
open(
    file,
    mode='r',
    buffering=-1,
    encoding=None,
    errors=None,
    newline=None,
    closefd=True,
    )- 参数 file- 指定需要打开文件的 路径
- 可以是 相对路径
- 也可以是 绝对路径
 
- 参数 mode- 指定文件打开的 模式- r:只读文本模式打开,默认模式
- w:只写文本模式打开
- a: 追加文本模式打开
 
- 默认值为 r
 
- 指定文件打开的 模式
- 参数 encoding- 指定读写文本文件时,使用的 字符编解码 方式
- 未指定参数值时,会使用系统缺省字符编码方式(中文 windows 系统上使用的是 cp936,也就是 GPK 编码
 
2. 文件读写模式
| 模式 | 可做操作 | 文件不存在时 | 光标位置 | 是否覆盖 | 
|---|---|---|---|---|
| r | 只读 | 报错 | 起始 | - | 
| r+ | 可读可写 | 报错 | 起始 | 是 | 
| w | 只写 | 创建 | 起始 | 是 | 
| w+ | 可读可写 | 创建 | 起始 | 是 | 
| a | 只写 | 创建 | 末尾 | - | 
| a+ | 可读可写 | 创建 | 末尾 | - | 
- r+:可读可写- 读取、写入 文件时,需要 文件存在
- 文件写入内容后,立即读取时需要 调整光标位置,否则读取信息为空。
 
- w+:可读可写- 在文件读取时,默认是 先写后读 ,直接读取文件时系统会默认写入一个 空值 ,覆盖原有的内容,所以读取内容为 空 。
- 文件写入内容后,立即读取时需要 调整光标位置,否则读取信息为空。
 
- a+:可读可写- 读取文件时,需要 调整光标的位置 ,否则读取信息为空。
 
3. 文件写入
# 指定编码方式为 utf8
f = open('tmp.txt','w',encoding='utf8')
# write方法会将字符串编码为utf8字节串写入文件
f.write('祝大家好运气')
# 文件操作完毕后, 使用close 方法关闭该文件对象
f.close()警告
使用 w 或者 w+ 模式时,会将文件原有内容 删除 。
4. 读取文件
# 指定编码方式为 gbk,gbk编码兼容gb2312
f = open('tmp.txt','r',encoding='gbk')
# read 方法会在读取文件中的原始字节串后, 根据上面指定的gbk解码为字符串对象返回
content = f.read()
# 文件操作完毕后, 使用close 方法关闭该文件对象
f.close()
# 通过字符串的split方法获取其中用户名部分
name = content.split(':')[0]
print(name)5. read、readline、readlines 的区别
| 函数 | 默认读取范围 | 换行符 | 返回结果 | 
|---|---|---|---|
| read | 一次性读取所有内容 | 不读取文章末尾的换行符 | 返回的是整个内容的字符串 | 
| readline | 一行一行的读取文件内容 | 会读取文章末尾的换行符 | 返回每一行,也是字符串 | 
| readlines | 一次性读取所有内容 | 会读取文章末尾的换行符 | 返整个内容列表(一行一个元素) | 
- read()方法- f = open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8") data = f.read() print(type(data)) print(data) f.close()
- readline()方法- f = open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8") for i in range(3): data = f.readline().strip() print(data) f.close() - image-20210415170154997 
- readlines()方法- f = open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8") data = f.readlines() print(type(data)) print(data) f.close() - image-20210415170323361 
6. 光标移动( seek()函数)
- seek(m, n)函数- m:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。- 0 :光标移动到文件 开始位置
- -1 :光标移动到文件 末尾位置
 
- n:默认为 0 ,不需要写,当写 1 或者 2 时 ,需要在 rb 模式 (二进制模式)下才能生效- 0 :代表从文件开头开始算起
- 1 :代表从当前位置开始算起
- 2 :代表从文件末尾算起。
 
 
二、 with 语句
with 语句 :打开文件时,不需要我们调用 close 方法 关闭文件
# open返回的对象 赋值为 变量 f
with open('tmp.txt') as f:
    linelist = f.readlines()
    for line in linelist:
        print(line)with open 可以同时打开多个文件
with open('d:/200906.txt')as file1,open('d:/200906_1.txt') as file2:
    print(file1.read())
    print(file2.read())三、 写入缓冲
f = open('tmp.txt','w',encoding='utf8')
f.write('祝大家好运气')
# 等待 30秒,再close文件
import time
time.sleep(30)
f.close()代码在未执行 f.close() 语句之前,写入内容是存放在 **缓冲区,在 缓冲区 未堆满或者 未执行 关闭文件 语句之前,写入内容不会写入文件。
如果需要立即写入文件,则需要使用 flush 方法
f = open('tmp.txt','w',encoding='utf8')
f.write('祝大家好运气')
# 立即把内容写到文件里面
f.flush()
# 等待 30秒,再close文件
import time
time.sleep(30)
f.close()