跳转至

19. 文件读写

文件 file

什么是文件
        文件是用于数据存储的单位
        文件通常用来长期存储数据
        文件中的数据是以字节(byte)为单位进行存储的

文件的操作流程

  1. 打开文件

  2. 读/写 文件

  3. 关闭文件

    注: 任何操作系统, 一个应用程序同时打开文件的数量有最大数限制

文件的打开函数

open(file, mode='rt')
        用于打开一个文件,返回文件流对象,如果打开失败则会触发OSError错误

文件流的关闭方法

​ F.close() # 关闭文件,释放系统资源

with open('mynote.txt', 'w', encoding='utf-8') as f:
    try:
        f.write('今天天气好晴朗')
    finally:
        f.close()

文本文件的操作

    文本文件的模式字符
        't'
    说明
        1. 对文本文件的读写需要用字符串str 进行读取和写入数据
        2. 默认文件中存储的都是字符(文字)数据,在读写中会自动进行编码转换操作
        3. 以行为单位分隔,在python内统一用'\n'作为换行符进行分隔

    各操作系统的换行符
        Linux换行符: '\n'
        Windows 换行符: '\r\n'
        旧的Macintosh换行符: '\r'
        新的Mac Os换行符: '\n'

文本文件读方法

    f.readline()
    f.readlines()
    f.read(字符数或字节数)

文本文件的写方法

    f.write(字符串)
    f.writelines(字符串列表)
练习
自己写一个文件'info.txt' 内部存一些文字信息如下
        张三 20 100
        李四 21 96
        小王 20 98
注
    以上信息用空格作用分隔符分开
写程序将这些数据读取出来,并以如下格式打印出来
    张三 今年 20岁, 成绩是:100
    李四 今年 21岁, 成绩是:96
    小王 今年 20岁, 成绩是:98

模式字符串

'w'  只写覆盖
'x'  文本模式
'a'  只写追加

文件的迭代读取

​ 文件流对象是可迭代对象,迭代过程将以换行符'\n'作为分隔符依次获取

# 示例
    f = open('info.txt', 'rt', encoding='utf-8')
    for line in f:  # f绑定的文件流对象是可迭代对象
        print(line)
    f.close()
练习
  1. 写程序,读读入任意行文字,当输入空行时结束输入,先将这些读入的文字存入列表中,然后再把列表里的内容存入到'input.txt'文件中
  2. 写程序,从上题的'input.txt'中读取之前输入的数据,读取到列表中,加上行号进行输出

标准输入输出文件

    sys.stdin 标准输入文件(默认为键盘设备)
        ctrl + d  (Linux) 是让键盘输入文件结束符

    sys.stdout 标准输出文件(默认为屏幕终端)
    sys.stderr 标准错误输出文件(默认为屏幕终端)
        模块名:sys
    说明
        1. 标准文件不需要打开和关闭就能使用
        2. 每一个python程序启动后都会有以上三个文件供我们使用
# 此示例示意标准输入文件的用法
import sys
s = sys.stdin.readline()
print(s)

sys.stdin.close()  # 关闭stdin 文件,则input无法使用
s2 = input('请输入')
print(s2)
import sys
sys.stdout.write('我是一个标准输出\n ')
sys.stderr.write('我的出现是个错误!!!\n')

help(print)

二进制文件操作

模式字符: 'b'

默认文件中存储的都是以字节为单位的数据,通常有人为的格式,对二进制文件的读写需要用字节串(bytes) 进行操作

常用的操作方法

    F.read([字节数/字符数])
        对于文本文件,F.read()返回类型为字符串str
        对于二进制文件,F.read()返回类型为字节串bytes
    F.write()
        同上,对于二进制文件,写入的数据为字节串bytes或字节数组bytearray
f.tell()方法

返回当前的读写位置(以字节为单位,从1开始)

     # 此示例示意tell方法的用法
    try:
        with open('text.txt', 'rb') as f:
            b = f.read(3)  # 读了3个字节
            pos = f.tell()
            print('当前的读写位置是:', pos)
            f.read(1)
            print('再读一次后,读写位置是:', f.tell())
    except OSError:
        print('读取失败')
    finally:
        f.close()
f.seek()方法
    作用
        设置文件的读写位置
    格式
        f.seek(偏移量,whence=相对位置)
        偏移量
            大于0代表向文件尾方向移动
            小于0代表向文件头方向移动
        相对位置
            0 代表从文件头开始偏移
            1 代表从当前位置开始偏移
            2 代表从文件尾开始偏移
# 此示例示意seek方法的用法
try:
    with open('text.txt', 'rb') as f:
        f.seek(5, 0)  # 文件读指针从文件头开始向右移动5个字节
        b = f.read(3)
        print(b)

except OSError:
    print('读取文件失败')

finally:
    f.close()
f.flush() 方法
    # 此示例示意flush方法的用法
    try:
        with open('myflush.txt', 'w') as f:
            f.write('aaaaaaaaaa')
            f.flush()  # 强制将缓冲区的内容写到磁盘上
            s = input('请输入回车继续:')
            print('ok')

    except OSError:
        print('读取文件失败')

    finally:
        f.close()