Python知识点九(文件内光标的移动 文件内数据的修改 函数(并非数学里面的函数 很简单))

昨日内容回顾

  • 读写模式之a只追加模式

    路径不存在会自动创建文件
    路径存在并不会清空文件内容并且默认末尾追加文件内容
    
  • 常见文件操作的方法

    read()  # 一次性读取文本内容(当文件内容特别大的时候容易造成内存出)
    readline()  # 一次性读取文件一行内容
    readlines()  # 也是一次性读取文件内容 组织成列表返回 每个元素是行
    readable()  # 是否具备可读的能力
    write()  # 写入内容
    writelines()  # 循环写入容器内每个元素
    writeable()  # 是否具备可写的能力
    flush()  # 立刻将文件数据刷新到硬盘(人为ctrl+s)
    
    '''优化操作'''
    文件变量也支持for循环 
    	每次for循环其实就是读取文件一行内容
    
  • 文件操作相关练习(重要)

    # 简易版本的注册功能
        1.获取用户输入的用户名和密码(尾部可以加strip())
        2.组织成你自己喜欢的格式(用户名|密码 为了将来更加方便的取)
        3.文件操作利用w模式打开一个文件 并写入
    # 简易版本的登陆功能
        1.获取用户输入的用户名和密码(尾部可以加strip())
        2.读取文件内真实的用户名和密码数据
        3.对用户名和密码做处理(切割、解压赋值)
        4.利用if判断用户名和密码是否正确
    
    # 多用户注册登录
    
  • 操作模式

    t	文本模式
    	是所有读写模式的默认模式  r w a >>> rt wt at
            1.该模式只支持操作文本文件
            2.该模式读写最小单位都是字符串
            3.该模式必须指定encoding参数
    b	二进制模式
    	并不是默认的模式 需要人为指定 r w a >>> rb wb ab
        	1.该模式支持操作所有类型的文件
            2.该模式读写最小单位都是bytes类型
            3.该模式不需要指定encoding参数  
    

今日内容概要

  • 作业讲解

  • 文件内光标的移动

  • 文件内数据的修改

  • 函数(并非数学里面的函数 很简单)

    函数简介
    函数语法结构
    函数的返回值
    函数的参数
    

作业讲解

# 简易版本的拷贝功能
	1.获取待拷贝的目标文件路径
    2.获取即将拷贝到哪个地方的新路径
    3.利用文件操作实现数据拷贝
    
# 1.待拷贝的文件路径
wait_copy_file = input('file path>>>:').strip()
# 2.新的文件路径
new_file_path = input('new path>>>:').strip()
# 3.以r模式打开步骤1的路径 以w模式打开步骤2的路径
with open(r'%s' % wait_copy_file, 'rb') as f1, \
        open(r'%s' % new_file_path, 'wb') as f2:
    for line in f1:
        f2.write(line)

二进制模式读写操作

with open(r'a.txt','rb') as f:
    print(f.read())
    print(f.read(6).decode('utf8'))


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

"""
read()  括号内可以放数字
    在t模式下表示字符个数
    在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
"""

文件内光标的移动

with open(r'b.txt', 'rb') as f:
    print(f.read(4).decode('utf8'))
    print(f.tell())  # 查看光标移动了多少个字节
    f.seek(3, 1)
    print(f.read().decode('utf8'))
"""
控制文件内光标的移动  f.seek()
f.seek(offset,whence)
    offset表示位移量
        始终是以字节为最小单位
            正数从左往右移动
            负数从右往左移动
    whence表示模式
        0:以文件开头为参考系(支持tb两种模式)
        1:只支持b模式 以当前位置为参考系
        2:只支持b模式 以文件末尾为参考系
"""

# 小练习:实现动态查看最新一条日志的效果
import time
with open('a.txt', 'rb') as f:
    f.seek(0, 2)
    while True:
        line = f.readline()
        if len(line) == 0:
            # 没有内容
            time.sleep(0.5)
        else:
            print(line.decode('utf-8'), end='')

文件的内容修改

# 方式1 覆盖
with open(r'c.txt','r',encoding='utf8') as f:
    data = f.read()
    # print(type(data))
with open(r'c.txt','w',encoding='utf8') as f1:
    new_data = data.replace('tony','jason')
    f1.write(new_data)

# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
        open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt')  # 删除原文件
os.rename('c.txt.swap', 'c.txt')  # 重命名文件

"""
自己总结两种方式的优缺点
"""

函数前戏

l = [11, 22, 33, 44, 55, 66, 77, 88]
print(len(l))  # 假设len无法使用

def my_len():
    n = 0
    for i in l:
        n += 1
    print(n)
print(my_len())
"""
1.我们现在所写的代码无法做到精简 需要用就必须重复写
    模仿len的内部源码
2.我们现在所写的代码兼容性极差(无法解决)
3.我们现在所写的代码没有返回值(无法解决 使用之后的返回结果)
函数简介
    函数就类似于是工具 提前定义好之后可以反复使用
"""

函数语法结构

# 函数语法结构

def 函数名(参数1,参数2):
    '''函数注释'''
    函数体代码
    return 返回值
    
1.def(必须的)
    是定义函数的关键字
2.函数名(必须的)
    是函数的名字 相当于变量名
    函数名的命名规范与风格遵循变量名的
3.参数1,参数2(可选的)
    参数可以没有也可以有多个 
    表示在使用函数之前需要满足的一些条件
4.函数注释(可选的)
    类似于产品说明书
    主要用于介绍函数功能 参数使用 及其他情况
5.函数体代码(必须的)
    函数核心的代码逻辑(重要)
6.return返回值(可选的)
    使用函数之后反馈给使用者的结果 可以有也可以没有

函数的定义与调用

###########################################################
1.函数必须先定义后调用(顺序不能乱)
2.函数在定义阶段只检测语法不执行代码
3.函数在调用阶段才会执行函数体代码
	如何调用函数
    	函数名加括号 如果函数在定义阶段有参数则在调用阶段也需要给参数
###########################################################
函数在定义与调用阶段底层原理
1.在内存空间中申请一块空间存储函数体代码
2.将函数体代码所在的空间地址绑定给函数名
3.函数名加括号则会执行函数体代码

函数的分类

1.内置函数
	python解释器自带的(提前给你定义好了 你直接使用即可)
2.自定义函数
	程序员自己写的函数
    2.1.无参函数
    2.2.有参函数
    2.3.空函数
 
# 无参函数:在函数定义阶段括号内没有写参数(变量名)
def my_func():
    print('这个函数很牛逼')

# 有参函数:在函数定义阶段括号内写了参数(变量名)
def my_func(a,b):
    print('这个函数更牛逼')
my_func(1,2)

# 空函数:函数体代码为空(pass ...)
"""
虽然空函数本身没有含义 但是空函数可以提前规定好编写代码的思路
"""
def run():
    pass
def fight():
    pass
def talk():
    pass

作业一 : 文件多用户注册登录

while True:
    print("""
1.注册
2.登录
    """)
    choice = input('请输入您想要执行的功能编号>>>:')
    # 判断用户输入的编号
    if choice == '1':
        print('请输入你的账号和密码')
    # 1.获取用户用户名和密码
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        # 2.将用户名和密码组织成一个字符串
        data = '%s|%s\n' % (username, password)
        # 2.1.判断用户名是否已存在
        with open(r'../userinfo.txt', 'w+t', encoding='utf8') as f1:
            # 2.2.循环读取每一行用户数据
            for line in f1:
                # 2.3.获取每一行数据中的用户名
                real_name, real_pwd = line.split('|')
                # 2.4.判断用户名是否一致
                if username == real_name:
                    print('用户名已存在')
                    break
            else:
                # 3.文件操作 写入数据
                with open(r'../userinfo.txt', 'a', encoding='utf8') as f:
                    f.write(data)
                print('用户:%s 注册成功' % username)
    # 判断用户输入的编号
    if choice == '2':
        print('请输入你的账号和密码')
    # 多用户登录
    # 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        # 2.获取文件内真实的用户数据
        with open(r'../userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:
                # 3.切割字符串获取真实的用户名和密码
                '''注意密码末尾有\n'''
                real_name, real_pwd = line.split('|')  # ['jason', 'jason123\n']
                # 4.比对用户名和密码是否正确
                if username == real_name and password == real_pwd.strip('\n'):
                    print('登录成功')
                    break
            else:
                print('用户名或密码错误')

作业二 : 无参函数封装作业一

while True:
    print("""
    1.用户注册
    2.用户登录
    """)

    def choice1():
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        # 2.将用户名和密码组织成一个字符串
        data = '%s|%s\n' % (username, password)
        # 2.1.判断用户名是否已存在
        with open('../userinfo.txt', 'a+', encoding='utf8') as f1:
            # 2.2.循环读取每一行用户数据
            for line in f1:
                # 2.3.获取每一行数据中的用户名
                real_name, real_pwd = line.split('|')
                # 2.4.判断用户名是否一致
                if username == real_name:
                    print('用户名已存在')
                    break
            else:
                # 3.文件操作 写入数据
                with open(r'../userinfo.txt', 'a', encoding='utf8') as f:
                    f.write(data)
                print('用户:%s 注册成功' % username)

    def choice2():
        # 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        # 2.获取文件内真实的用户数据
        with open(r'../userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:
                # 3.切割字符串获取真实的用户名和密码
                '''注意密码末尾有\n'''
                real_name, real_pwd = line.split('|')  # ['jason', 'jason123\n']
                # 4.比对用户名和密码是否正确
                if username == real_name and password == real_pwd.strip('\n'):
                    print('登录成功')
                    break
            else:
                print('用户名或密码错误')

    choice = input('选择你要运行的项目:')
    if choice == '1':
        choice1()
    elif choice == '2':
        choice2()
    else:
        print('没有改功能 爱咋滴咋滴!')
posted @ 2021-11-12 20:46  弑悟  阅读(8)  评论(0)    收藏  举报