文件操作
利用python代码的编写来读写文件
1.文件的概念
就是操作系统暴露给用户操作硬盘的快捷方式
eg:双击一个文件 其实是从硬盘将数据加载到内存
ctrl+s保存文件 其实是将内存中的数据刷到硬盘保存
2.文件的操作方式
代码打开文件的两种方式
方式1:
f = open(文件路径,读写模式,encoding='utf8')
f.close()
方式2:
with open('a.txt', 'r', encoding='utf8') as f1:
with子代码块
ps:with上下文管理好处在于子代码运行结束自动调用close方法关闭资源
"""
open方法的第一个参数是文件路径 并且撬棍跟一些字母的组合会产生特殊的含义导致路径查找混乱 为了解决该问题可以在字符串的路径前面加字母r
D:\a\n\t
r'D:\a\n\t'
以后涉及到路径的编写 推荐加上r
with支持一次性打开多个文件
with open() as f1,open() as f2,open() as f3:
子代码
"""
3.文件读写模式
'r' 只读模式:只能读不能写
# 1.文件路径不存在:会直接报错
with open(r'b.txt','r',encoding='utf8') as f:
print(f.read())
# 2.文件路径存在:正常读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read())
'w' 只写模式:只能写不能看
# 1.文件路径不存在:自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
# 2.文件路径存在:先清空文件内容 之后再写入
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('假期综合征 赶紧要调整\n')
f.write('假期综合征 赶紧要调整\n')
f.write('假期综合征 赶紧要调整\n')
'''强调:换行符需要自己添加 并且在后续数据读取比对的时候也一定要注意它的存在'''
'a' 只追加模式:文件末尾添加数据
# 1.文件路径不存在:自动创建
with open(r'c.txt', 'a', encoding='utf8') as f:
pass
# 2.文件路径存在:自动在末尾等待追加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('放假七天和上班七天感觉是完全不一样的')
"""
当我们在编写代码的时候 有些部分不知道写什么具体代码 但是也不能空着不写
这个时候可以使用关键字
pass
...
只补全语法不执行功能 本身没有任何的含义
"""
4.文件操作模式
t 文本模式
默认的模式 我们上面所写的r w a其实全称是 rt wt at
1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定encoding参数 如果不知道则会采用计算机默认的编码
b 二进制模式(bytes模式)
不是默认的模式 需要自己指定 rb wb ab
1.可以操作任意类型的文件
2.读写都是以bytes为单位
3.不需要指定encoding参数 因为它已经是二进制模式了 不需要编码
二进制模式与文本模式针对文件路径是否存在的情况下 规律是一样的!!!
5.文件诸多方法
1.read()
一次性读取文件内容 并且光标停留在文件末尾 继续读取则没有内容
并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出
括号内还可以填写数字 在文本模式下 表示读取几个字符
2.for循环
一行行读取文件内容 避免内存溢出现象的产生
3.readline()
一次只读一行内容
4.readlines()
一次性读取文件内容 会按照行数组织成列表的一个个数据值
5.readable()
判断文件是否具备读数据的能力
6.write()
写入数据
7.writeable()
判断文件是否具备写数据的能力
8.writelines()
接收一个列表 一次性将列表中所有的数据值写入
9.flush()
将内存中文件数据立刻刷到硬盘 等价于ctrl + s
6.文件内容修改
# 文件a.txt内容如下
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
# 执行操作
with open('a.txt', 'r+', encoding='utf8') as f:
f.seek(9)
f.write('<妇女主任>')
# 文件修改后的内容如下
张一蛋<妇女主任> 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的
文件内容修改方式:
方式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', 'qyf'))
方式2:换地写
优点: 不会占用过多的内存
缺点: 在文件修改过程中同一份数据存了两份
'''先在另外一个地方写入内容 然后将源文件删除 将新文件命名成源文件'''
import os
with open('a.txt', 'r', encoding='utf8') as read_f, \
open('.a.txt.swap', 'w', encoding='utf8') as write_f:
for line in read_f:
write_f.write(line.replace('qyf', 'qyfnp'))
os.remove('a.txt') # 删除a.txt
os.rename('.a.txt.swap', 'a.txt') # 重命名文件
7.文件光标移动
with open(r'a.txt', 'rb') as f:
print(f.read())
f.seek(0,0)
print(f.read())
f.seek(0, 0)
print(f.read())
# print(f.read(2).decode('utf8'))
# f.seek(-1, 2)
# print(f.tell()) # 返回光标距离文件开头产生的字节数
"""
seek(offset, whence)
offset是位移量 以字节为单位
whence是模式 0 1 2
0是基于文件开头
文本和二进制模式都可以使用
1是基于当前位置
只有二进制模式可以使用
2是基于文件末尾
只有二进制模式可以使用
"""
# print(f.read(3).decode('utf8'))
文件内光标移动实战案列(了解)
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='')
函数
函数前戏
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.编写简易版本的拷贝工具
# 自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
# 任何类型数据皆可拷贝
# 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:思考多用户数据情况下如何组织文件内数据结构较为简单
# 提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
# 基础版本的注册功能
# 1.获取用户名和密码
username = input('please input your username>>>:').strip()
password = input('please input your password>>>:').strip()
# 2.构造用户名和密码的组合
user_data = f'{username}|{password}' # jason|123
# 3.打开文件写入数据即可
with open(r'userinfo.txt', 'w', encoding='utf8') as f:
f.write(user_data)
# 基础版本的登录功能
# 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:
real_name, real_pwd = f.read().split('|')
# 3.校验用户名和密码是否正确
if username == real_name and password == real_pwd:
print('登录成功')
else:
print('用户名或密码错误')
# 进阶版本注册功能
# 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}注册成功')
# 进阶版本登录功能
# 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('请输入新用户名:').strip()
password = input('请输入密码:').strip()
with open('userinfo.txt', 'a', encoding='utf8') as f:
f.write(f'{username}|{password}\n')
print(f'用户{username}注册成功')
def login():
'''登陆功能'''
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
with open('userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
true_name, true_pwd = line.strip().split('|')
if username == true_name and password == true_pwd:
print('登录成功')
break
else:
print('用户名或密码错误')
def menu():
'''菜单功能'''
print('''
-----------
1.用户注册
2.用户登录
3.退出
-----------
''')
def func():
'''主体功能'''
while True:
menu()
choice = input('请输入您要执行对应功能的编号:').strip()
if choice.isdigit():
if choice == '1':
register()
elif choice == '2':
login()
elif choice == '3':
print('欢迎下次使用')
break
else:
print('请输入对应编号')
else:
print('请输入数字')
func()
员工管理系统函数登录
user_data_dict = {}
def user_info():
'''功能1员工添加'''
while True:
# 1.获取员工编号
emp_id = input('请输入该员工的员工编号(q)>>>:').strip()
if emp_id == 'q':
break
# 判断编号是否是纯数字
if not emp_id.isdigit():
print('员工编号必须是纯数字')
continue
# 2.判断员工编号是否已存在
if emp_id in user_data_dict:
print('员工编号已存在 请重新录入')
continue
# 3.获取员工详细信息
username = input('请输入员工姓名>>>:').strip()
age = input('请输入员工年龄>>>:').strip()
job = input('请输入员工岗位>>>:').strip()
salary = input('请输入员工薪资>>>:').strip()
# 4.构建一个临时的小字典
temp_dict = {}
# 5.添加员工信息键值对
temp_dict['emp_id'] = emp_id
temp_dict['name'] = username
temp_dict['age'] = age
temp_dict['job'] = job
temp_dict['salary'] = salary
# 6.添加到大字典中
user_data_dict[emp_id] = temp_dict
print(f'员工{username}添加成功')
def one_info():
'''功能2展示一个员工信息'''
while True:
# 1.先获取员工编号
target_id = input('请输入您想要查看的员工编号(q)>>>:').strip()
if target_id == 'q':
break
# 2.判断员工编号是否不存在
if target_id not in user_data_dict:
print('员工编号不存在 无法查看')
continue
# 3.根据员工编号获取员工字典数据
user_dict = user_data_dict.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')}
--------------------------------------------
""")
def all_info():
'''功能3所有员工信息展示'''
for user_dict in user_data_dict.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 delete_info():
'''功能1员工信息删除'''
while True:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要删除的员工编号(q)>>>:').strip()
if target_id == 'q':
break
if target_id not in user_data_dict:
print('员工编号不存在')
continue
# 2.字典删除键值对
user_data_dict.pop(target_id)
def reset_info():
'''功能5员工信息修改'''
while True:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要修改的员工编号(q)>>>:').strip()
if target_id == 'q':
break
if target_id not in user_data_dict:
print('员工编号不存在')
continue
# 2.获取新的薪资
print('''
=========
1.name
2.age
3.job
4.salary
=========
''')
modle = input('您要修改的内容name/age/job/salary>>>:').strip()
mod = input('请输入你想修改的内容>>>:').strip()
# 3.获取员工字典
user_dict = user_data_dict.get(target_id) # {'salary':123}
# 4.修改字典中的薪资
user_dict[modle] = mod # {'salary': 321}
# 5.修改大字典
user_data_dict[target_id] = user_dict
print(user_data_dict.get(target_id))
def menu():
"""菜单功能"""
print("""
1.创建员工信息
2.查看某个员工信息
3.查看全部员工信息
4.删除员工信息
5.修改员工信息
6.退出
""")
def func():
'''主体功能'''
while True:
menu()
choice = input('请输入您要执行对应功能的编号:').strip()
if choice.isdigit():
if choice == '1':
user_info()
elif choice == '2':
one_info()
elif choice == '3':
all_info()
elif choice == '4':
delete_info()
elif choice == '5':
reset_info()
elif choice == '6':
break
else:
print('该编号暂无功能')
else:
print('请输入数字')
func()
标签:文件,函数,基本知识,dict,user,print,input
From: https://www.cnblogs.com/qian-yf/p/16772432.html