一.文件操作的流程
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、查詢余額功能:輸入賬號查詢余額
登錄功能
用戶登錄成功后,內存中記錄下該狀態,上述功能以當前登錄狀態為准,必須先登錄才能操作
代碼如下:
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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。