一.文件操作的流程
1、打开文件
open('C:a.txt
bcd.txt')
解决方案一:推荐
open(r'C:a.txt
bcd.txt')
解决方案二:
open('C:/a.txt/nb/c/d.txt')
f=open(r'aaa/a.txt',mode='rt') # f的值是一种变量,占用的是应用程序的内存空间
2、操作文件:
读/写文件,应用程序对文件的读写请求都是在向操作系统发送系统调用,然后由操作系统控制硬盘把输入读入内存、或者写入硬盘
res=f.read()
3、关闭文件
f.close() # 回收操作系统资源
f.read() # 变量f存在,但是不能再读了
二.资源管理与with上下文管理
打开一个文件包含两个部分资源:应用程序的变量f和操作系统打开的文件。
在操作完一个文件后必须把这两部分的资源回收
通常回收有两种方法:
1 f.close()#回收操作系统打开的文件资源
2 del f # 回收应用程序资源
其中,del f 一定要发生在f.close()之后,否则就会导致操作系统打开的文件无法关闭,。
python的垃圾回收机制让我们无序考虑del f,所以我们必须记住,操作完毕后一定要fclose(),
但是我们都是比较懒或者比较健忘的,所以python就有with关键字来帮助我们管理上下文。
1. with open('a.txt',mode='rt') as f1:# f1=open('a.txt',mode='rt')
pass
2. with open('a.txt',mode='rt') as f1,
open('b.txt',mode='rt') as f2:
res1=f1.read()
res2=f2.read()
print(res1)
三.文件的操作模式
文件的读写操作的模式有
- r(默认):只读
- w:只写
- a:只追加写
文件的读写内容的模式有
t 文本模式:1.读写文件都是以字符串为单位
2.只能针对文本文件
3.必须制定encoding参数
b 二进制模式:1.读写文件都是以bytes为单位的
2.可以针对所有文件
3.一定不能制定encoding参数
强调:t和b不能单独使用,必须跟r/w/a连用
各模式的参考案例
1、r(默认的操作模式):
只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
实现用户认证功能
应用程序====》文件
应用程序====》数据库管理软件=====》文件
2、w:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置
案例:w模式用来创建全新的文件
文件文件的copy工具
就是读一个文件,再写一个文件,把读的复制给写的。
# src_file=input('源文件路径>>: ').strip() # dst_file=input('目标文件路径>>: ').strip() # with open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1, # open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2: # res=f1.read() # f2.write(res)
3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾
with open('e.txt',mode='at',encoding='utf-8') as f: # f.read() # 报错,不能读 f.write('1 ') f.write('2 ') f.write('3 ')
强调 w 模式与 a 模式的异同:
1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
案例:a模式用来在原有的文件内存的基础之上写入新的内容,比如记录日志、注册
注册功能
name=input('your name>>: ') pwd=input('your name>>: ') with open('db.txt',mode='at',encoding='utf-8') as f: f.write('{}:{} '.format(name,pwd))
了解:+不能单独使用,必须配合r、w、a
r+,w+,a+:可读可写
编写ATM程序实现下述功能,数据来源于文件db.txt
1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改
2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱
3、提现功能:用户输入提现金额,db.txt中该账号钱数减少
4、查询余额功能:输入账号查询余额
登录功能
用户登录成功后,内存中记录下该状态,上述功能以当前登录状态为准,必须先登录才能操作
代码如下:
import os user_staus = {'username': None} def ad_credit(username, amount): """ 充值功能 :param username: :param amount: :return: """ if user_staus['username'] is None: login() with open('db.txt', 'rt', encoding='utf-8')as f1, open('db.txt.swap', 'wt', encoding='utf-8')as f2: while True: cont = f1.readline() if len(cont) == 0: break name, remain = cont.strip().split(':') if username in name: remain = int(remain) + int(amount) f2.write('{}:{} '.format(name, remain)) print('充值成功,{}的余额为{}'.format(username, remain)) else: f2.write(cont) os.remove('db.txt') os.rename('db.txt.swap', 'db.txt') def transfer(user_out, user_in, amount): '''3 转账功能 :param user_out: :param user_in: :param amount: :return: ''' if user_staus['username'] is None: login() with open('db.txt', 'rt', encoding='utf-8')as f1, open('db.txt.swap', 'wt', encoding='utf-8')as f2: userinfo = {} for line in f1: name, remind = line.strip().split(':') userinfo[name] = int(remind) if user_out not in userinfo: print('用户不存在') return if user_in not in userinfo: print('收款方不存在') return if user_out in userinfo and user_in in userinfo: if userinfo[user_out] >= int(amount): userinfo[user_out] -= int(amount) userinfo[user_in] += int(amount) print('转账成功,已成功从{}向{}汇款{}'.format(user_out, user_in, amount)) elif userinfo[user_out] < amount: print('余额不足') return for name, remind in userinfo.items(): f2.write('{}:{} '.format(name, remind)) os.remove('db.txt') os.rename('db.txt.swap', 'db.txt') def cashon(username, amount): ''' 提现功能 :param username: :param amount: :return: ''' if user_staus['username'] is None: login() with open('db.txt', 'rt', encoding='utf-8')as f1, open('db.txt.swap', 'wt', encoding='utf-8')as f2: userinfo = {} for line in f1: name, remind = line.strip().split(':') userinfo[name] = int(remind) if username not in userinfo: print('用户不存在') return if username in userinfo and userinfo[username] >= int(amount): userinfo[username] -= int(amount) print('已从余额中取出{},现余额为{}'.format(amount, userinfo[username])) elif userinfo[username] < amount: print('余额不足,提现失败') return for name, remind in userinfo.items(): f2.write('{}:{} '.format(name, remind)) os.remove('db.txt') os.rename('db.txt.swap', 'db.txt') def check(username): ''' 余额查询功能 :param username: :return: ''' if user_staus['username'] is None: login() with open('db.txt', 'rt', encoding='utf-8')as f: userinfo = {} for line in f: name, remind = line.strip().split(':') userinfo[name] = remind if username not in userinfo: print('用户不存在') return if username in userinfo: print('当前余额为:{}'.format(userinfo[username])) def login(): username = input('输入用户名') userpassword = input('输入密码') with open('login.txt', 'rt', encoding='utf-8')as login_f: login = {} for line in login_f: name, psd = line.strip().split(':') login[name] = psd if username in login: if login[username] == userpassword: print('登陆成功') user_staus['username'] = username break elif username not in login: print('用户名不存在') return def logout(): user_staus['username'] = None print('已成功登出') return login() tag = True while tag: cmd = input(''' 请输入你想使用的功能序号 1:充值 2:转账 3:提现 4:查询余额 0:登出 ''') if cmd == '1': username = input('输入用户名:') amount = input('输入充值金额:') ad_credit(username, amount) elif cmd == '2': user_out = input('请输入转账方:') user_in = input('请输入接收方:') amount = input('输入转账金额:') transfer(user_out, user_in, amount) elif cmd == '3': username = input('输入用户名:') amount = input('输入提现金额') cashon(username, amount) elif cmd == '4': username = input('输入用户名:') check(username) elif cmd == '0': logout() tag = False else: print('请正确输入序号')
以下是模拟结果
'''
/Users/chenfeng/PycharmProjects/ATM/venv/bin/python /Users/chenfeng/PycharmProjects/ATM/main.py
输入用户名xilou
输入密码666
登陆成功
请输入你想使用的功能序号
1:充值
2:转账
3:提现
4:查询余额
0:登出
1
输入用户名:xilou
输入充值金额:200
充值成功,xilou的余额为700
请输入你想使用的功能序号
1:充值
2:转账
3:提现
4:查询余额
0:登出
2
请输入转账方:xilou
请输入接收方:heiren
输入转账金额:200
转账成功,已成功从xilou向heiren汇款200
请输入你想使用的功能序号
1:充值
2:转账
3:提现
4:查询余额
0:登出
3
输入用户名:xilou
输入提现金额100
已从余额中取出100,现余额为400
请输入你想使用的功能序号
1:充值
2:转账
3:提现
4:查询余额
0:登出
4
输入用户名:xilou
当前余额为:400
请输入你想使用的功能序号
1:充值
2:转账
3:提现
4:查询余额
0:登出
0
已成功登出
Process finished with exit code 0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。