zoukankan      html  css  js  c++  java
  • Python学习之路基础篇--08Python基础+ 文件的基本操作和 注册小作业

    1 文件的基本操作

    #1. 打开文件的模式有(默认为文本模式):
    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    w,只写模式【不可读;不存在则创建;存在则清空内容】
    a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
    
    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
    rb 
    wb
    ab
    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
    
    #3,‘+’模式(就是增加了一个功能)
    r+, 读写【可读,可写】
    w+,写读【可写,可读】
    a+, 写读【可写,可读】
    
    #4,以bytes类型操作的读写,写读,写读模式
    r+b, 读写【可读,可写】
    w+b,写读【可写,可读】
    a+b, 写读【可写,可读】

    2 文件的方法

    read(3):
    
      1. 文件打开方式为文本模式时,代表读取3个字符
    
      2. 文件打开方式为b模式时,代表读取3个字节
    
    其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
    
    注意:
    
      1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的(如是移动中文的话,在utf-8 中移动,若不是3的倍数,就会报错)
    
      2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。(不知道可不可以调光标)

    r 读模式:

      若在E盘下的可以把文件的相对路径写入如下:(不存在此文件时,会报错)

    f = open('e:/new.txt',mode = 'r', encoding='utf-8')#编码用什么方式编的, 就要用什么方式打开,在pyCharm 中默认是用utf-8 编写的
    conenct = f.read()
    print(conenct)
    f.close()
    f = open('newt',mode = 'r', encoding='utf-8')#编码用什么方式编的, 就要用什么方式打开,在pyCharm 中默认是用utf-8 编写的
    conenct = f.read()
    print(conenct)
    f.close()

      这是打开python 文件下目录下文件, 就不用写绝对路径,只需要定相对路径即可

      注意 :在文件操作时一定要记得关闭文件,也就是close

    rb bytes模式下的读(非文本类型的时候用)

    f = open('file1',mode='rb')
    conenct = f.read()
    print(conenct)#b'xe6x88x91xe6x83xb3xe7x9dxa1xe8xa7x89'
    f.close()

      因为是用 bytes 类型打开,所以就不用写解码方式,打印的数据是 utf-8 ,因为我写了四个中文,12个字节

    w 写模式

      不存在就创建,存在就全删在写

    f = open('file1',mode='w',encoding='utf-8')
    conenct = f.write('我想睡觉')
    print(conenct)#返回值为其的字符个数,只能写,覆盖,不能读
    f.close()

    wb bytes模式下的写

    f = open('file1',mode='wb')
    conenct = f.write('傻不傻'.encode('utf-8'))
    print(conenct)#返回的其字节个数 9
    f.close()

    a 追加

      其实和w 差不多, 只是不会删除,在之后写上而以(ab 都一样,和wb 差不多)

    r+ 读写模式(在读的基础上加了写的功能,但是只有两个功能, 再读的话就不行了)这个功能是用的最多的

    w+ 与a+

    f = open('file1',mode='w+',encoding='utf-8')
    f.write('afdf')
    f.seek(0)#要移动光标才能读出来东西
    print(f.read(2))
    f.close()

    3 对文件的修改

      将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

    import os  # 调用系统模块
    
    with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        data=read_f.read() #全部读入内存,如果文件很大,会很卡
        data=data.replace('alex','SB') #在内存中完成修改
    
        write_f.write(data) #一次性写入新文件
    
    os.remove('a.txt')  #删除原文件
    os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件

    方法一

      方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

    import os
    
    with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        for line in read_f:
            line=line.replace('alex','SB')
            write_f.write(line)
    
    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt') 
    
    方法二

    ps: 

      以后打开方式用 with 可以不用 close

    with open('log',mode='r+',encoding='utf-8') as f,open('log',mode='w+',encoding='utf-8') as f1:

      也可以打开多个文件

    4 注册小作业

      一个简单的注册登入作业,如果没有账号就创建一个新的,有就用原来的账号登入,

    flag = True
    while flag:
        i = 0
        while i <3 and flag :
            whether_account = input('是否拥有账号,如果有请输入 y,没有输入 n(输入 q 退出):')
            if whether_account.strip() == 'y':
                break
            elif whether_account.strip() =='n':
                username = input('请输入想要注册的用户名:')
                password = input('请输入密码:')
                with open(username, mode='w+', encoding='utf-8') as f1:
                   f1.write('{}
    {}'.format(username,password))
                break
            elif whether_account.strip() =='q':
                flag =False
            elif i !=2:
                print('请输入正确字符,你只有{}机会'.format(2-i))
            i +=1
        lis = []
        i = 0
        try:
            while i < 3  and flag:
                user_name = input('请输入你的账号:')
                password = input('请输入你的密码:')
                with open(user_name, mode='r+', encoding='utf-8') as f2:
                    for lin in f2:
                        lis.append(lin.strip())
                if user_name == lis[0] and password == lis[1]:
                    print('欢迎登入'.center(51,'~'))
                    flag = False
                elif i != 2:
                    print(' 你只有 %d 次机会' %(2-i))
                i += 1
        except(FileNotFoundError) as e:
           c
  • 相关阅读:
    在C#中使用SQL存储过程说明
    asp.net后台获取html控件值
    SQL字符串操作汇总[记住这个]select substring(quantityperunit,charindex('',quantityperunit)+1,100) as 结果 from products
    分页控件AspnetPager的用法,巩固用
    摆脱Access在.net中中模糊查询,老错的困扰
    基于黑金开发板的秒表verilog hdl程序
    2808 sci 接收中断
    黑金开发板状态机实现的可用按键控制的流水灯
    基于黑金开发板的键盘边沿检测程序
    可以使用键盘实现加减数的数码管的verilog hdl程序(基于黑金开发板)
  • 原文地址:https://www.cnblogs.com/YS-0717/p/9413559.html
Copyright © 2011-2022 走看看