内容概要
简易版拷贝工作练习题
文件内光标的移动
文件内数据的修改
函数
函数简介
函数语法结构
函数的返回值
函数的参数
练习题
# 简易版本的拷贝功能
# 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 f,\
open(r'%s' % new_file_path, 'wb') as f1:
for line in f:
f1.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('utf8'), end='')
文件的内容修改
# 方式1 覆盖
# with open(r'a.txt', 'r', encoding='utf8') as f:
# data = f.read()
# print(type(data)) # <class 'str'>
# with open(r'a.txt', 'w', encoding='utf8') as f1:
# new_data = data.replace('tony', 'jason')
# f1.write(new_data)
# 方式2 新建
import os
# with open(r'a.txt', 'rt', encoding='utf8') as f,\
# open(r'a.txt', 'wt', encoding='utf8') as write_f:
# for line in read_f:
# write_f.write(line.replace('SB', 'kevin'))
# os.remove('c.txt') # 删除原文件
# os.rename(r'a.txt.swap', 'a.txt') # 重命名文件
函数前戏
l = [11, 22, 33, 44, 55, 66, 77, 88]
# print(len(l))
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('这个函数很牛逼')
# my_func()
# 有参函数:在定义阶段括号内写了参数(变量名)
# def my_func(a,b):
# print('这个函数更牛逼')
# my_func(1,2)
# 空函数:函数体代码为空(pass...)
'''
虽然空函数本身没有定义,但是空函数可以提前规定好编写代码的思路
'''
例:
def run()
pass
def talk()
pass
# 用户注册登录系统(目前还有用户注册后 出现输入正确信息提示用户名或密码错误的bug,目前还没找到)
# 用户选择功能
while True:
print("""
1.用户注册
2.用户登录
3.退出登录
""")
choice = input('请输入您要操作的选项>>>:').strip()
# 用户选择选项1
if choice == '1':
# 获取用户输入用户名和密码
username = input('请输入新建用户名>>>:').strip()
password = input('请输入密码>>>:').strip()
# 把用户名和密码转为一个字符串
data = '%s|%s\n' %(username, password)
# 打开'a.txt' 只读模式
with open(r'a.txt', 'r', encoding='utf8') as f2:
# 循环每一行用户数据
for line in f2:
# 切分已注册的用户信息
real_name, real_pwd = line.split('|')
# 判断用户需要新建的用户名是否和已注册信息重复
if username == real_name:
# 若重复 反馈用户
print('用户:%s已存在'% username)
break
else:
# 用只写模式打开a.txt
with open(r'a.txt', 'a', encoding='utf8') as f:
# 将用户名和密码用字符串形式写入a.txt文档
f.write(data)
# 反馈用户注册情况
print('用户:%s注册成功'% username)
# 用户选择选项2
elif choice == '2':
# 用户登录功能
# 1.获取用户输入
username = input('请输入您的用户名>>>:').strip()
password = input('请输入您的密码>>>:').strip()
# 打开储存用户信息的文件
with open(r'a.txt', 'r', encoding='utf8') as f1:
for line in f1:
real_name, real_pwd == line.split('|')
if username == real_name and password == real_pwd.strip('\n'):
print('用户:%s登录成功'% username)
else:
print('用户名或密码输入错误')
# 用户选择选项3
elif choice == '3':
# 反馈给用户指令执行
print('正在退出用户:%s 账户,欢迎下次光临!'% username)
# 退出程序
break
# 输入其他选项,提示用户该选项暂未上线
else:
print('抱歉%s 功能还未上线敬请期待!'% choice)