zoukankan      html  css  js  c++  java
  • Python文件操作基础流程超详细解析

    一.文件操作的流程

    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

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

  • 相关阅读:
    no-octal-escape (Rules) – Eslint 中文开发手册
    Object.isSealed (Object) – JavaScript 中文开发手册
    AngularJS SQL
    Eclipse 内容辅助
    ionic 单选框操作
    CSS border-top-color 属性
    Java 集合:(二十八) SortedMap 接口
    Java 集合:(二十七)Properties实现类
    Java 集合:(二十六) Hashtable 实现类
    Java 集合:(二十五)备用2
  • 原文地址:https://www.cnblogs.com/java2018/p/12525373.html
Copyright © 2011-2022 走看看