文件处理和函数简介

文件光标的移动

read文本模式

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


read二进制模式

#read在二进制模式下,粗气指定的字节数,在utf8中,通常汉字三个字节,字母一个字节
with open(r'a.txt', 'rb') as f:
    print(f.read(3))
    print(f.read(3))
>>>你
>>>好

控制光标的移动

with open('a.txt','r',encoding='utf8') as f:
    print(f.read())
    f.seek(3,1)
    print(f.read()) #保存,seek(3,1),表示为相对当前光标向后移动三个字节,而当前光标处于末尾,所有read()无法读取内容因而报错
    with open('a.txt','rb') as f:
        print(f.read(3).decode('utf8'))  #读取三个字节的内容
        f.seek(-3,2)  #相对与末尾,向前移动三个字节,然后读取
        print(f.read().decode)
	>>>你
	>>>xdn
    '''
    seek方法可以控制光标的移动,无论什么模式移动的基本单位都是字节数
    seek(offset,whence)
    offset 控制的时光标的移动位数,正数从左向右,负数,从右向左
    whence 表示光标的位置
    0 回到文件起始位置
    1 光标当前位置
    2 光标移动到文件末尾
    其中0可以用于文本文本模式,1和2只能用于二进制模式
    whence不穿参数,默认为0
    '''

文件的修改

'''
机械硬盘上的数据有两个状态:
	占有态
	自由态
删除数据就是将数据的状态改变成自由态,自由态的数据会被新的数据覆盖。
文件的内容也是写死的,不能从中间添加新的内容,只能将老的内容删除在添加新的 
'''
# 对文件进行修该的思路1,将内容读入内存,在内存中进行修改,在写入硬盘覆盖原文件
	优点:在修改文件过程中,同一份文件数据只有一份
    缺点:会过多的占用内存
with open('b.txt', 'r', encoding='utf8') as f:
    data = f.read()
with open('b.txt', 'w', encoding='utf8') as f:
    f.write(data.replace('张一蛋','jack'))
# 思路2,以读的方式打开源文件,以写的方式打开一个临时文件,一行行的读取源文件的内容,修改完后写入临时文件,然后删除源文件,将临时文件重新命名
	优点:不会占用过多内存
    缺点:在文件修改过程中同一份数据存在两份

函数

函数简介

'''
函数,相当一个随时随地可重复使用的工具,他与循环有一些类似,都是要反复的执行一段相同的代码。但是不同的是,循环是在一个固定的位置,通过条件判断来确定是否执行;而函数存在的位置不固定,通过函数的调用来重复的执行函数体代码
'''

函数分为内置函数和自定义函数,内置函数就是python解释器自带的函数,例如len()、count()等。自定义函数则是我们自己定义的函数。

'''
函数又分为有参函数和无参函数,有参函数调用时需要传递一个参数,而无参函数则不用
'''
eg:
    s = 'hello world!'
# 有参函数
	s.count('l')
    >>>3
# 无参函数
	s.len()
    >>>12

函数的语法结构

def 函数名(参数1,参数2):
    '''函数的注释'''
    函数代码体
    return 返回值
1.def  
	定义函数的关键字
2.函数名
	类似与变量名,指代函数体代码,命名规范与变量名一致
3.括号
	函数名后面必须跟括号
4.参数
	参数可以又多个或者没有,作用是将数据传递给代码体
5.冒号
	表示又子代码块
6.函数注释
	用于解释代码功能使用方法等    当函数功能一目了然时可不写
7.函数体代码
	函数的核心功能,调用函数时所执行的代码
8.return
	后面跟什么,函数执行完后就会返回什么
'''
定义函数时,不会执行函数体代码,只会检查语法
调用函数需要使用函数名加括号
'''

作业

点击展开

def verify_pwd(pwd):
    '''
    通过参数pwd传入用户输入的密码,与文件a.txt中的数据进行校验
    '''
    with open(r'a.txt') as f:
        for line in f:
            d = line.strip('\n')
            if pwd == d.split('|')[1]:
                return True
def verify_username(username):
    '''
    通过参数username传入用户输入的账号,与文件a.txt中的数据进行校验
    '''
    with open(r'a.txt') as f:
        for line in f:
            if username == line.split('|')[0]:
                return True
def data_save(info):
    '''
    将用户数据存入文件
    '''
    with open(r'a.txt', 'a') as f:
        f.write(info)
while True:
    print('******\n1.登录\n2.注册\n******')
    choice = input('请选择>>>:')
    if choice == '1':
        username_input = input('请输入用户名>>>:').strip()
        pwd_input = input('请输入密码>>>:').strip()
        if verify_pwd(pwd_input) and verify_username(username_input):
            print('登录成功')
        else:
            print('用户名或密码错误')
    if choice == '2':
        while True:
            username_input2 = input('请输入你想注册的用户名>>>:').strip()
            if verify_username(username_input2):
                print('用户名已存在')
            else:
                pwd_input2 = input('请设置登录密码>>>:')
                data = f'{username_input2}|{pwd_input2}\n'
                data_save(data)
                break
posted @   名字只需六字  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示