python基础9 文件操作2

160 阅读4分钟

文件内的光标移动

  • 我们直接创建一个文本文件a.txt。在a.txt内输入:
a.别人越学越牛逼!

如图: image.png

  • 然后进行我们的操作。

文本模式 默认t rt>>>t

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read(5)     # 读出来的是5个字符
    print(data)

输出结果: image.png

二进制模式 不默认 rb>>>rb

with open(r'a.txt', 'rb') as f:
    data = f.read(5)     # 读出来是字节,英文1字节,中文3字节
    print(data)
** 二进制模式时read()里面的数字会有时因为字节数而报错,所以需要注意输出的字节数能与字符对应出来

输出结果: image.png

tell() 获取光标移动的字节数

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read(3)
    print(data)          # 输出读到的数据
    print(f.tell())      # 获得光标移动的字节数是5
    data1 = f.read()     # 赋值一个data1,让其接着读取。
    print(data1)         # 会从光标位置,输出剩下的字符

输出结果: image.png

with open(r'a.txt', 'rb') as f:
    data = f.read(5)     # 读出来是字节
    print(data.decode('utf8'))  # 在输出时解码为utf码

输出结果: image.png

seek(offset,whence) 代码控制光标移动

    # offset所在位置表示光标移动的字节是多少
    # whence是一个模式有3种功能:
        # 数字0表示基于文件开头需要移动多少字节
        # 数字1表示在当前位置时移动多少字节
        # 数字2表示基于文件末尾移动多少字节
***举例:
    # seek(3,0)
    # seek(3,1)
    # seek(3,2)
    #3表示光标移动字节,数字012就是指代功能。但是12指代的功能,只能在二进制下使用。所以我们读取时需要二进制模式,解码时有需要转回utf8,不然会报错

0 模式

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f. read(5)
    print(data)
    f.seek(5, 0)
    print(f.read())

输出结果: image.png

1 模式

with open(r'a.txt', 'rb') as f:    # 二进制
    data = f.read(8)
    print(data.decode('utf8'))
    f.seek(-6, 1)
    print(f.read().decode('utf8'))

输出结果: image.png

2 模式

with open(r'a.txt', 'rb') as f:    # 二进制
    data = f.read(8)
    print(data.decode('utf8'))     # 输出转utf8
    f.seek(-9, 2)
    print(f.read().decode('utf8'))

输出结果: image.png

文件内的数据修改

通过代码实现修改文件时,可以通过两种方式:

  • 第一种是覆盖写:
读取文件内容从内存中修改完成以后,使用w模式直接把原文件内容进行替换。
     覆盖写的优点:
       * 占用空间少
     覆盖写的缺点:
       * 数据量较大时内存会溢出

例:输入代码:

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()
    new_data = data.replace('别人越学越牛逼!', '我越学越懵逼!')
with open(r'a.txt', 'w', encoding='utf8') as f1:
    f1.write(new_data)

输出结果:打开a.txt可以看到里面的一些内容已被更换。 image.png image.png

  • 第二种是重命名:
读取文件内容从内存中修改完成以后,保存为一个另一个新文件,将原文件删除,把自己的文件名进行修改,替代旧文件。
     重命名的优点:
       * 不会造成内存溢出
     重命名的缺点:
       * 可能需要占用两个空间,也可能在内存中创建,没有存储到硬盘。

例:输入代码:

import os
with open('a.txt', 'r', encoding='utf8') as read_f,\
    open('.a.txt.swap', 'w', encoding='utf8') as write_f:
    for line in read_f:
        write_f.write(line.replace('越懵逼!', '越牛逼!'))
os.remove('a.txt')                 # 删除文件
os.rename('.a.txt.swap', 'a.txt')  # 重命名文件

输出结果: image.png image.png

函数简介

  • 循环:在相同的位置反复执行相同的代码
完成列表数据值个数统计:
* 自定义统计方法
def my_len():
    value_count = 0
    for i in l1:
        value_count += 1
    print(value_count)
  • 函数:在不同的位置反复执行相同的代码
    如果我们需要多次用到一个功能时。此时就需要用到函数。
* 函数有什么优点呢?
    对比我们自定义的方法,调用函数大大增加了我们的工作效率。而且我们自定义写出来的统计方法,只能统计固定数据类型的数据值个数,也没有产生返回值,调用函数就可以避免这一问题。

文件读写模式拓展

读写模式

x模式

  • 当文件存在时,无法创建文件。会直接报错
  • 当文件不存在时,先创建文件然后写入。 执行代码:
with open(r'b.txt', 'x', encoding='utf8') as f:
    f.write('123456')

输出结果: image.png image.png

+模式

  • +模式可以与r,w,a组合使用变成r+,a+,w+。主要功能时更新读和写

r+ 可读可写

  • 可以读也可以写,但是文件不存在时会报错。

w+ 写读

  • 创建新文件,写入,文件不存在会创建,文件存在会覆盖写入内容会覆盖原来内容。

a+ 追加读写

  • 写入方式与a模式相同,但是可以进行读取操作。如果刚使用a+打开一个文件,一般不能直接读取。因为光标在内容的末尾。一般需要搭配seek使用

小练习

1.尝试着将今日作业第二题注册、登录功能封装成函数
	参考老师博客尝试编写
2.查阅资料或者源码了解更多文件读写模式并写入博客中
	查看并优化之前所写所有博客
    	图文结合 标题排版 代码环境等