文件操作

一. 文件操作介绍

1. 文件:
    操作系统暴露给用户可以直接操作硬盘的快捷方式

2. 代码操作文件的流程:
    2.1 打开文件、创建文件
    2.2 编辑文件内容
    2.3 保存文件内容
    2.4 关闭文件

with open(r'a.txt', 'r', encoding='utf8') as f:    # f = open()

二. 文件操作模式

t模式
    文本模式 是默认的模式
        r    rt
        w    wt
        a    at
    1.该模式只能操作文本文件
    2.该模式必须要指定encoding参数
    3.该模式读写都是以字符串为最小单位

b模式
    二进制模式  可以操作任意类型的文件
        rb     不能省略b
        wb     不能省略b
        ab     不能省略b
    1.该模式可以操作任意类型的文件
    2.该模式不需要指定encoding参数
    3.该模式读写都是以bytes类型为最小单位

三. 文件读写模式

r    read     只读模式:只能读不能写
w    write    只写模式:只能写不能读
a    append   只追加模式:在文件末尾添加内容

'''-------------------------------------一. r模式---------------------------------------------'''

# 路径不存在:直接报错
with open(r'b.txt', 'r', encoding='utf8') as f1:

# 路径存在:正常打开文件并等待内容读取
with open(r'a.txt', 'r', encoding='utf8') as f1:
print(f1.read())                                         # 一次性读取文件内所有的内容
f1.write('python是最牛逼的语言!!!')                       # 报错

"""
able在英语中大部分情况下表示的是 具备...的能力
    readable    具备读的能力
    writable    具备写的能力
    ...
"""
'''-------------------------------------二. w模式---------------------------------------------'''

# 路径不存在:自动创建文件
with open(r'b.txt', 'w', encoding='utf8') as f1:

# 路径存在:先清空文件内容 之后再写入数据
with open(r'a.txt', 'w', encoding='utf8') as f1:
    f1.write('你们是我见过的最优秀一批学生1\n')            # 写入文件内容
    f1.write('你们是我见过的最优秀一批学生2\r')            # 写入文件内容
    f1.write('你们是我见过的最优秀一批学生3\n')            # 写入文件内容
    print(f1.read())

"""
换行  最早的时候:\r\n
为了节省空间支持一个字符 根据操作系统的不同可能有所区别
    \n 、 \r
"""
'''-------------------------------------三. a模式---------------------------------------------'''

# 路径不存在:自动创建文件
with open(r'c.txt', 'a', encoding='utf8') as f1:

# 路径存在:不会清空文件内容 而是在文件末尾等待新内容的添加
with open(r'a.txt', 'a', encoding='utf8') as f1:
    f1.write('哈哈哈哈或或或或或')
    print(f1.read())

四. 文件内置方法

1. 一次性读取文件内容
    read()
    1.1 执行完之后光标在文件末尾 继续读取没有内容
    1.2 当文件内容特别大的时候 容易造成内存溢出(满了)

    # read在文本模式下 括号内的数字表示的是读取指定的字符个数
    with open(r'a.txt','r',encoding='utf8') as f:
        print(f.read(3))
        print(f.read(3))

    # read在二进制模式下 括号内的数字表示的是读取指定的字节数
    with open(r'a.txt', 'rb') as f:
        print(f.read(9).decode('utf8'))
        print(f.read(1).decode('utf8'))



2. 一次只读一行内容
    readline()

3.结果是一个列表 里面的各个元素是文件的一行行内容
    readlines()

4. 判断当前文件是否可读
    readable()
    支持for循环                     # 一行行读取文件内容(推荐使用)  内存中同一时刻只会有一行内容

5. 写入文件内容(字符串或者bytes类型)
    write()

6. 可以将列表中多个元素写入文件
    writelines()

7. 判断文件是否可写
    writable()

8. 相当于主动按了ctrl+s(保存)
    flush()

9. 获取光标距离文件开头的字节数
    tell()

五. 文件内光标的移动(了解)

1. 前戏
    with open(r'a.txt','r',encoding='utf8') as f:
        print(f.read(3))
        print(f.read(3))
    # read在文本模式下 括号内的数字表示的是读取指定的字符个数

    with open(r'a.txt', 'rb') as f:
        print(f.read(9).decode('utf8'))
        print(f.read(1).decode('utf8'))
    # read在二进制模式下 括号内的数字表示的是读取指定的字节数
    # unicode所有的字符都是用2bytes来起步表示
    # utf8中文用3bytes来表示 英文用1bytes来表示  往后unicode可以不做研究  只研究utf8、gbk等编码即可

2. 控制光标的移动
     with open(r'a.txt','r',encoding='utf8') as f:
         print(f.read())
         f.seek(3,1)
         print(f.read())

     with open(r'a.txt', 'rb') as f:
         print(f.read(3).decode('utf8'))
         f.seek(3, 1)                                 # 基于当前位置 继续往后移动三个字节
         f.seek(-3, 2)                                # 基于文件末尾 往前移动三个字节
         print(f.tell())                              # 获取光标基于文件开头的字节数
         print(f.read().decode('utf8'))
    """
    seek方法可以控制光标的移动 在文本模式下移动的单位也是字节数
    seek(offset,whence)
        offset:控制移动的字节数
        whence:控制模式
            0:相对于文件开头(让光标先移动到文件开头)
                支持文本模式和二进制模式
            1:相对于当前位置(让光标先停留在当前位置)
                只支持二进制模式
            2:相对于文件结尾(让光标先移动到文件末尾)
                只支持二进制模式
    """

    # 实时检测文件内是否有新增的内容并打印出来(没有太多的实际意义)
    with open('access.log', mode='rb') as f:
        f.seek(0, 2)
        while True:
            line = f.readline()
            if len(line) == 0:
                # 没有内容
                pass
            else:
                print(line.decode('utf-8'), end='')
posted @ 2023-05-05 12:38  codegjj  阅读(0)  评论(0编辑  收藏  举报