十、文件读写

文本文件的打开分为两种模式:文本模式二进制模式

通常,对 文本文件 都是以 文本模式 打开。程序读取 和 写入 的都是 字符串 对象。

一、 open 函数

1. open 函数的参数

open 函数的参数:

1
2
3
4
5
6
7
8
9
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. 文件写入

1
2
3
4
5
6
7
8
# 指定编码方式为 utf8
f = open('tmp.txt','w',encoding='utf8')

# write方法会将字符串编码为utf8字节串写入文件
f.write('祝大家好运气')

# 文件操作完毕后, 使用close 方法关闭该文件对象
f.close()

::: danger

使用 w 或者 w+ 模式时,会将文件原有内容 删除

:::

4. 读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 指定编码方式为 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() 方法

    1
    2
    3
    4
    5
    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() 方法

    1
    2
    3
    4
    5
    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() 方法

    1
    2
    3
    4
    5
    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 方法 关闭文件

1
2
3
4
5
# open返回的对象 赋值为 变量 f
with open('tmp.txt') as f:
linelist = f.readlines()
for line in linelist:
print(line)

with open 可以同时打开多个文件

1
2
3
with open('d:/200906.txt')as file1,open('d:/200906_1.txt') as file2:
print(file1.read())
print(file2.read())

三、 写入缓冲

1
2
3
4
5
6
7
8
9
f = open('tmp.txt','w',encoding='utf8')

f.write('祝大家好运气')

# 等待 30秒,再close文件
import time
time.sleep(30)

f.close()

代码在未执行 f.close() 语句之前,写入内容是存放在 **缓冲区,在 缓冲区 未堆满或者 未执行 关闭文件 语句之前,写入内容不会写入文件。

如果需要立即写入文件,则需要使用 flush 方法

1
2
3
4
5
6
7
8
9
10
11
f = open('tmp.txt','w',encoding='utf8')

f.write('祝大家好运气')
# 立即把内容写到文件里面
f.flush()

# 等待 30秒,再close文件
import time
time.sleep(30)

f.close()