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、查詢余額功能:輸入賬號查詢余額

登錄功能

用戶登錄成功后,內存中記錄下該狀態,上述功能以當前登錄狀態為准,必須先登錄才能操作

代碼如下:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM