Python文件操作基础流程超详细解析
一.文件操作的流程
1、打开文件
open('C:\a.txt\nb\c\d.txt')
解决方案一:推荐
open(r'C:\a.txt\nb\c\d.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\n') f.write('2\n') f.write('3\n')
强调 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('{}:{}\n'.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、查询余额功能:输入账号查询余额
登录功能
用户登录成功后,内存中记录下该状态,上述功能以当前登录状态为准,必须先登录才能操作
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | 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( '{}:{}\n' . 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( '{}:{}\n' . 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( '{}:{}\n' . 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 后端思维之高并发处理方案
· 想让你多爱自己一些的开源计时器
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 上周热点回顾(3.24-3.30)
· 大模型 Token 究竟是啥:图解大模型Token