文件内光标移动案例
import time
with open('access.log',mode='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='')
计算机硬盘修改数据的原理
硬盘写数据可以看成是在硬盘上刻字 一旦需要修改中间内容 则需要重新刻字
因为刻过的字不可能从中间再分开
硬盘删除数据的原理
不是直接删除而是改变状态 等待后续数据的覆盖才会被真正删除
文件内容修改
# 文件a.txt内容如下:
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
'''
with open('a.txt', mode='r+', encoding='utf-8') as f:
# f.seek(9, 0)
f.seek(9) # seek模式就是0模式,第二个参数可以不指定
f.write('<男妇女主任>')
'''
# 文件a.txt内容修改以后:
张一蛋<男妇女主任>9 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
文件对应的是硬盘空间,硬盘不能修改对应着文件本质也不能修改,
那我们看到文件的内容可以修改,是如何实现的呢?
大致的思路是将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘
具体的实现方式分为两种:
文件修改方式一
# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
with open('db.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
with open('db.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('kevin','SB'))
文件修改方式二
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('SB','kevin'))
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
函数前戏
name_list = ['jason', 'kevin', 'oscar', 'jerry']
def my_len():
count = 0
for i in name_list:
count += 1
print(count)
my_len()
循环
相同的代码在相同的位置反复执行
函数
相同的代码在不同的位置反复执行
ps:相同的代码不是真正一模一样而是可以通过传入的数据不同而做出不同的改变
函数相当于是工具(具有一定功能)
不用函数
修理工需要修理器件要用锤子 原地打造 每次用完就扔掉 下次用继续原地打造
用函数
修理工提前准备好工具 什么时候想用就直接拿出来使用
在程序中,具备某一功能的‘工具’指的就是函数,‘事先准备工具’的过程即函数的定义,‘拿来就用’即函数的调用。
函数的语法结构
1语法
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
1def: 定义函数的关键字;
2函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
3括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
4冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
5"""文档描述""": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
6函数体:由语句和表达式组成;
7return 值:定义函数的返回值,return是可有可无的。
参数是函数的调用者向函数体传值的媒介,若函数体代码逻辑依赖外部传来的参数时则需要定义为参函数
def my_min(x,y):
res=x if x < y else y
return res
否则定义为无参函数
def interactive():
user=input('user>>: ').strip()
pwd=input('password>>: ').strip()
return (user,pwd)
函数的定义与调用
1.函数在定义阶段只检测语法 不执行代码
def func():
pass
函数体为pass代表什么都不做,称之为空函数。定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,然后把所有功能都列举出来用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绑定
"""
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
作业
# 2.使用函数将员工管理系统封装
def adduser():
while 1:
emp_id = input('请输入该员工的员工编号(q)>>>:').strip()
if emp_id == 'q':
break
if not emp_id.isdigit():
print('员工编号必须纯数字')
continue
if emp_id in user_data_dic:
print('员工编号已存在,请重新输入')
continue
username = input('请输入员工姓名>>>:').strip()
age = input('请输入员工年龄>>>:').strip()
job = input('请输入员工岗位>>>:').strip()
salary = input('请输入员工薪资>>>:').strip()
temp_dict = {}
temp_dict['emp_id'] = emp_id
temp_dict['name'] = username
temp_dict['age'] = age
temp_dict['job'] = job
temp_dict['salary'] = salary
user_data_dic[emp_id] = temp_dict
print(f'员工{username}添加成功')
break
def check_one():
while 1:
target_id = input('请输入您想要查看的员工编号(q)>>>:').strip()
if target_id == 'q':
break
# 2.判断员工编号是否不存在
if target_id not in user_data_dic:
print('员工编号不存在 无法查看')
continue
# 3.根据员工编号获取员工字典数据
user_dict = user_data_dic.get(target_id)
# 4.格式化输出
print(f"""
--------------info of emp-------------------
编号:{user_dict.get('emp_id')}
姓名:{user_dict.get('name')}
年龄:{user_dict.get('age')}
岗位:{user_dict.get('job')}
薪资:{user_dict.get('salary')}
--------------------------------------------
""")
break
def check_all():
for user_dict in user_data_dic.values():
print(f"""
--------------info of emp-------------------
编号:{user_dict.get('emp_id')}
姓名:{user_dict.get('name')}
年龄:{user_dict.get('age')}
岗位:{user_dict.get('job')}
薪资:{user_dict.get('salary')}
--------------------------------------------
""")
def deluser():
while True:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要删除的员工编号(q)>>>:').strip()
if target_id == 'q':
break
if target_id not in user_data_dic:
print('员工编号不存在')
continue
# 2.字典删除键值对
user_data_dic.pop(target_id)
break
def update():
while True:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要修改的员工编号(q)>>>:').strip()
if target_id == 'q':
break
if target_id not in user_data_dic:
print('员工编号不存在')
continue
# 2.获取新的薪资
new_salary = input('请输入该员工的新薪资待遇>>>:').strip()
if not new_salary.isdigit():
print('薪资只能是纯数字')
continue
# 3.获取员工字典
user_dict = user_data_dic.get(target_id) # {'salary':123}
# 4.修改字典中的薪资
user_dict['salary'] = new_salary # {'salary': 321}
# 5.修改大字典
user_data_dic[target_id] = user_dict
print(user_data_dic.get(target_id))
break
def tem():
print("""
------员工管理系统-------------
1.添加员工信息
2查看单个员工信息
3查看全部员工信息
4修改员工信息
5删除员工信息
----------------------------
""")
user_data_dic = {}
while 1:
tem()
choice = input('请输入您进行编号功能').strip()
if choice == '1':
adduser()
elif choice == '2':
check_one()
elif choice == '3':
check_all()
elif choice == '4':
update()
elif choice == '5':
deluser()
else:
print('抱歉 暂无该功能编号!!!')
文件进阶注册登录封装
def login():
# 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('用户名或密码错误')
def register():
username = input('please input your username>>>:').strip()
password = input('please input your password>>>:').strip()
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}注册成功')
def enmu():
print("""
1.注册功能
2.登录功能
""")
while 1:
enmu()
choice = input('请选择您想要执行的功能编号>>>:').strip()
if choice == '1':
register()
elif choice == '2':
login()
else:
print('没有该功能编号')