文件读写、函数基础

昨天内容

文件基本操作

方式1
	f1 = open(path,mode,encoding="utf8")
  f1.close()
方式2
	with open(path,mode,encoding="utf8") as f2
  	f2.方法()
    #字代码结束自动调用f2.close()

文件读写模式

r	只读模式
	文件路径不存在直接报错 存在则打开文件等待读取
w	只写模式
	文件路径不存在自动创建 存在则先清空文件内容然后等待写入
a	只追加模式
	文件路径不存在自动创建 存在则自动在文件末尾等待写入

文件操作模式

t	文本模式
	默认的操作模式 rt wt at
	1.只能操作文本文件
 	2.读写都是以字符为单位
 	3.需要指定encoding参数
    
b	二进制模式
	1.能够操作所有类型的文件
 	2.读写都是以bytes为单位
 	3.不需要指定encoding参数

文件诸多方法

1.read()
	括号内不写数字则一次性读取文件内容 当文件内容较大的时候可能会造成内存溢出
 	括号内可以写数字 在不同模式下意思是读取几个字符或者几个字节
2.for循环
	文件对象支持for循环一行行读取文件内容 
3.readable()
	判断文件是否可读
4.readline()
	读取一行文件内容
5.readlines()
	一次性读取文件内容 按照行数组织成列表中一个个数据值
6.wirte()
	写入数据
7.writeable()
	判断文件是否可写
8.writelines()
	传列表 会自动将列表中所有的数据值写入
9.flush()
	相当于ctrl + s

文件光标的移动

seek(偏移量,模式)
	偏移量只能以字节为单位 
 	模式有三种0 1 2
tell()
	返回光标距离文件开头已经移动了多少个字节

今日内容概要

  • 作业讲解
  • 文件内光标的移动实战演练
  • 计算机硬盘存取数据的原理
  • 文件内容修改
  • 函数简介
  • 函数的语法结构
  • 函数的定义与调用

作业讲解

1.编写简易版本的拷贝工具
     自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
     任何类型数据皆可拷贝
     ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
1.获取想要拷贝的文件路径
source_file_path = input('请输入您想要拷贝的文件路径>>>:').strip()
2.获取目标文件的路径
target_file_path = input('请输入您想要拷贝到哪个地方的路径>>>:').strip()
3.打开第一个文件路径 读取内容写入第二个文件路径中
with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f:
    for line in read_f:
        write_f.write(line)
        
2.利用文件充当数据库编写用户登录、注册功能
  文件名称:userinfo.txt
  基础要求:
  		 用户注册功能>>>:文件内添加用户数据(用户名、密码等)
       用户登录功能>>>:读取文件内用户数据做校验
      ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
  拔高要求:
       用户可以连续注册
      用户可以多账号切换登录(多用户)  文件内有多个用户信息
      ps:思考多用户数据情况下如何组织文件内数据结构较为简单
    提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
   
while True:
    print("""
    1.注册功能
    2.登录功能
    """)
    choice = input('请选择您想要执行的功能编号>>>:').strip()
    if choice == '1':
        username = input('please input your username>>>:').strip()
        password = input('please input your password>>>:').strip()
        # 2.校验用户名是否已存在
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:  # 'jason|123'
                real_name, real_pwd = line.split('|')
                if username == real_name:
                    print('用户名已存在 无法完成注册')
                    break  # 一旦重复 没有必要继续往下校验是否重复了 直接结束循环
            else:
                with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
                    f1.write(f'{username}|{password}\n')
                print(f'用户{username}注册成功')
    elif choice == '2':
        # 1.获取用户名和密码
        username = input('please input your username>>>:').strip()  # 'jason'
        password = input('please input your password>>>:').strip()  # '123'
        # 2.打开文件读取内容并校验
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:  # 'jason|123\n'
                real_name, real_pwd = line.split('|')  # 'jason' '123\n'
                if real_name == username and real_pwd.strip('\n') == password:
                    print('登录成功')
                    break
            else:
                print('用户名或密码错误')
    else:
        print('没有该功能编号')

文件内光标移动案例(了解)

import time

with open(r'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('utf8'), end='')

计算机硬盘修改数据的原理(了解)

硬盘写数据可以看成是在硬盘上刻字 一旦需要修改中间内容 则需要重新刻字
因为刻过的字不可能从中间再分开

硬盘删除数据的原理
	不是直接删除而是改变状态 等待后续数据的覆盖才会被真正删除

文件内容修改(了解)

# 修改文件内容的方式1:覆盖写
# with open(r'a.txt', 'r', encoding='utf8') as f:
#     data = f.read()
# with open(r'a.txt', 'w', encoding='utf8') as f1:
#     f1.write(data.replace('jason', 'tony'))

# 修改文件内容的方式2:换地写
'''先在另外一个地方写入内容 然后将源文件删除 将新文件命名成源文件'''
import os

with open('a.txt', 'r', encoding='utf8') as read_f, \
        open('.a.txt.swap', 'w', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('tony', 'kevinSB'))


os.remove('a.txt')  # 删除a.txt
os.rename('.a.txt.swap', 'a.txt')  # 重命名文件

函数

name_list = ['jason', 'kevin', 'oscar', 'jerry']
# print(len(name_list))
'''突然len不准用了'''
# count = 0
# for i in name_list:
#     count += 1
# print(count)
'''统计列表内数据值个数的代码需要在很多地方使用'''
# 相同的代码需要在不同的位置反复执行
"""
循环
    相同的代码在相同的位置反复执行   
函数
    相同的代码在不同的位置反复执行
    ps:相同的代码不是真正一模一样而是可以通过传入的数据不同而做出不同的改变
"""
def my_len():
    count = 0
    for i in name_list:
        count += 1
    print(count)
my_len()    
"""
函数相当于是工具(具有一定功能)
    不用函数
        修理工需要修理器件要用锤子 原地打造 每次用完就扔掉 下次用继续原地打造
    用函数
        修理工提前准备好工具 什么时候想用就直接拿出来使用
"""

函数的语法结构

def 函数名(参数):
	'''函数注释'''
	函数体代码
	return 返回值
1.def
	定义函数的关键字
2.函数名
	命名等同于变量名
3.参数
	可有可无 主要是在使用函数的时候规定要不要外界传数据进来
4.函数注释
	类似于工具说明书
5.函数体代码
	是整个函数的核心 主要取决于程序员的编写
6.return
	使用函数之后可以返回给使用者的数据 可有可无

函数的定义与调用

1.函数在定义阶段只检测语法 不执行代码
	def func():
		pass
2.函数在调用阶段才会执行函数体代码
	func()
3.函数必须先定义后调用
4.函数定义使用关键字def函数调用使用>>>:函数名加括号
    如果有参数则需要在括号内按照相应的规则传递参数(后续详细讲解)

函数的分类

1.空函数
	函数体代码为空 使用的pass或者...补全的
 	空函数主要用于项目前期的功能框架搭建
 	 def register():
        """注册功能"""
        pass
2.无参函数
	 定义函数的时候括号内没有参数
	 def index():
        print('from index function')
3.有参函数
	定义函数的时候括号内写参数 调用函数的时候括号传参数
 	def func(a):
    	  print(a)

函数的返回值

1.什么是返回值
	调用函数之后返回给调用者的结果
2.如何获取返回值
	变量名 赋值符号 函数的调用
 	res = func()  # 先执行func函数 然后将返回值赋值给变量res
3.函数返回值的多种情况
	3.1.函数体代码中没有return关键字 默认返回None
 	3.2.函数体代码有return 如果后面没有写任何东西还是返回None
 	3.3.函数体代码有return 后面写什么就返回什么
 	3.4.函数体代码有return并且后面有多个数据值 则自动组织成元组返回
 	3.5.函数体代码遇到return会立刻结束

函数的参数

形式参数
	在函数定义阶段括号内填写的参数 简称'形参'
实际参数
	在函数调用阶段括号内填写的参数 简称'实参'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"""
形参与实参的关系
	形参类似于变量名 在函数定义阶段可以随便写 最好见名知意
	def register(name,pwd):
		pass
	
	实参类似于数据值 在函数调用阶段与形参临时绑定 函数运行结束立刻断开
	register('jason',123)   形参name与jason绑定 形参pwd与123绑定
"""
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

作业

# 1.整理两天的内容 完成相应作业考核
# 2.使用函数将员工管理系统和文件进阶注册登录封装
# 3.预习明日内容
# 	参数、名称空间、作用域
# userinfo = [{"name": "wuyong", "password": "123"}]
import json


def read_f(f_path):
    with open(f_path, "r", encoding="utf8") as f:
        message = f.read()
        userinfo = json.loads(message)
        f.flush()
        return userinfo


def write_f(f_path, userinfo):
    with open(f_path, "w", encoding="utf8") as f:
        f.write(json.dumps(userinfo))
        f.flush()
    return


def register_emp(username, password):
    userinfo = read_f(r"mytxt/userinfo.txt")
    for user in userinfo:
        if user["name"] == username:
            return "该用户已经存在"
    else:
        u_message = {}
        u_message["name"] = username
        u_message["password"] = password
        userinfo.append(u_message)
        write_f(r"mytxt/userinfo.txt", userinfo)
        return "新建员工成功"


def myinput():
    username = input("name>>>")
    password = input("password>>>")
    return username, password


def login(username, password):
    userinfo = read_f(r"mytxt/userinfo.txt")
    for user in userinfo:
        if user["name"] == username and user["password"] == password:
            return "登录成功"
    else:
        return "登录失败"


def delete_emp(name):
    userinfo = read_f(r"mytxt/userinfo.txt")
    for user in userinfo:
        if user["name"] == name:
            u_index = userinfo.index(user)
            userinfo.pop(u_index)
            write_f(r"mytxt/userinfo.txt", userinfo)
            return f"删除用户{user['name']}成功"
    else:
        return f"删除用户{name}不存在!"


def run():
    print("""
        1. 新建员工
        2. 登录
        3. 删除员工
    """)
    c = input("输入指令:")
    if c == "1":
        username, password = myinput()
        message = register_emp(username, password)
        print(message)

    elif c == "2":
        username, password = myinput()
        message = login(username, password)
        print(message)
    elif c == "3":
        name = input("delete name>>>")
        message = delete_emp(name)
        print(message)
    else:
        print("指令不存在!!!")


if __name__ == '__main__':
    while True:
        run()


posted @ 2022-10-09 15:07  虾仁猪心排骨汤  阅读(81)  评论(0编辑  收藏  举报