• day 09 小结


    1.文件处理

    什么是文件处理:修改储存的信息

    什么是文件:操作系统提供的虚拟概念,存储信息(用二进制储存信息)

    操作文件的流程:

    1. 打开文件# ①文件路径②打开模式,w-->write③
    print('D:上海python12期视频python12期视频day 09	est.py')#
    print('D:上海python12期视频python12期视频day 09\test.py') # \t--》第一个会让第二个失去意义
    print(r'D:上海python12期视频python12期视频day 09	est.py') #r会让内部所有的失效
    f = open(r'D:上海python12期视频python12期视频day 09	est.py','w',encoding='utf8')
    

    修改/读取文件

    f.write('''
    孩儿立志出湘关,学不成名誓不还
    埋骨何须桑之地,人生无处不青山
    ''')
    

    保存文件

    f.flush()  # 快速保存,你可以不使用
    

    关闭文件:python通过操作系统操作文件

    f.close()  # 告诉操作系统关闭文件
    

    2.文件的三种打开模式

    读取/写入/追加写入

    1 文件打开模式之r模式

    r:read,只读模式,只能读不能写,文件不存在时报错。

    f = open('32.txt', mode = 'r')  # 报错
    f.write()
    f.close
    
    # rt : read by text
    # windows 的操作系统默认编码为gbk,因此需要utf8编码
    f = open('32.txt', mode='rt', encoding='utf8')
    data = f.read()
    print(data)
    print(f"type(data): {type(data)}"")
    f.close()
    
    # rb : read by bytes
    f = open('32.txt', mode = 'rb')
    data = f.read()
    print(data)
    print(f"type(date): {type(data)}")
    f.close()
    

    f.read()读取文件指针会跑到文件的末端,如果再一次读取,读取的将是空格

    f = open('32.txt', mode ='rt',encoding='utf8')
    data1 = f.read()
    data2 = f.read()
    print(f"data1:{data1}")
    print(f"data2:{data2}")
    f.close()
    

    由于f.read()一次读取文件的所有内容,如果文件非常大,可能会造成内存爆掉,即电脑卡死。因此可以用f.readline()/f.readlines()读取内容

    # f.readline()/f.readlines
    f = open('32.txt',mode='rt', encoding='utf8')
    print(f"f.readable();{f.readable)}") # 判断文件是否可读
    data1 = f.readline()
    data2 = f.readlines()
    

    2 文件打开模式之w模式

    w:只能写,不能读,文件存在的时候会清空文件后再写入内容;文件不存在的时候会创建后写入内容

    # wt
    f = open('34w.txt', mode='wt', encoding='utf8')
    print(f"f.readable(): {f.readable()}")
    f.write('bob 真帅呀
    ')  # '
    '是换行符
    f.write('bob,bob, you drop, I drop.')
    f.write('nick 帅的我五体投地')
    f.flush()  # 立刻将文件内容从内存刷到硬盘
    f.close()
    
    # wb
    f = open('34a.txt', mode='wb')
    f.write('nick 帅的我五体投地'.encode('unicode_escape'))  # 编码成bytes类型
    print(
        f"type('nick 帅的我五体投地'.encode('unicode_escape')): {type('nick 帅的我五体投地'.encode('unicode_escape'))}")
    f.close()
    

    3 文件打开模式之a模式

    a:可以追加。文件存在,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。

    # at
    f = open('')
    f = open('34a.txt', mode='at', encoding='utf8')
    print(f"f.readable(): {f.readable()}")
    f.write('nick 真帅呀
    ')  # '
    '是换行符
    f.write('nick,nick, you drop, I drop.')
    f.write('nick 帅的我五体投地')
    f.close()
    

    4 文件打开读取二进制

    b模式是通用的模式,因为所有的文件在硬盘中都是以二进制的形式储存的,需要注意的是:b模式写文件,一定不能加上encoding参数,因为二进制无法再编码

    try:
        import requests
        
        resonse = requests.get(
        	'http://www.chenyoude.com/Python从入门到放弃/文件的三种打开模式-mv.jpg?x-oss-process=style/watermark')
        data = response.content
        
        f = open('mv.jpg?x-oss-process=style/watermark','wb')
        f.write(data)
        print('done...')
        f.close()
    except Exception as e:
        print(e,'报错了')
        
    f = open('32w.txt','wb')
    f.write('bob '.encode('utf8'))
    f.close
    

    3.绝对路径

    文件路径:文件在硬盘的地址

    绝对路径:从盘符开始 E:python12期day09 est.py

    相对路径:执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开的文件属于同一文件夹下

    未来的项目尽量用相对路径

    f = open('test.py', 'r',encoding='utf8')
    print(f.read())
    

    windows系统写代码,部署到Linux系统

    4.with管理文件操作上下文

    with提供一个自动关闭文件

    with open('test.py','r',encoding='utf8') as f:
        # print(f.read())
        #在这个缩进下不会关闭文件,在这个缩进下对文件操作
        data = f.read()  # data放到python的内存中
        
    print(data)
    # 关闭文件(操作系统),没有关闭python内存中的文件
    print(f)  # 只涉及到python
    # print(f.read())  # 涉及操作系统,报错
    
    

    5.文件的高级应用(了解)

    可读可写 r+

    with open('test.py','r+',endoding='utf8') as fr:
        # print(fr.readable())
        # print(fr.writable())
        fr.write('高级')  # 光标在文件头部,覆盖后面代码
    

    可写可读 w+ 和 w 没有任何区别

    with open('test.py','w+', encoding='utf8') as fw:
        print(fw.readable())
        print(fw.writable())
    

    可写可读 a+ a模式默认光标在尾部

    with open('test.py','a+',encoding='utg8') as fw:
        print(fw.readable())
        print(fw.writable())
        fw.seek(0.0)
        print(fw.read())
    

    综上:如果你真的有即可读又可写的需求,用两种不同的模式打开两次文件

    光标的高级应用(移动光标)

    seek

    with open('test.py', 'rb') as fr:
        fr.seek(5)  # 移动了3个字节,一个中文,默认从头开始
        print(fr.read())
        print(fr.read().decode('utf8'))
    

    whence规定只有0,1,2 三种模式 # 0相当于文件头开始;1相当于当前文件所在位置;2相当于在文件末尾

    fr.seek(3,0)  # 0开头
    print(fr.read().decode('utf8'))
    fr.seek(3.1)
    print(fr.read().decode('utg8'))
    fr.seek(0,2)
    print(fr.read())
    

    tell: 告诉你当前所在位置

    with open('test.py','rb')as fr:
        fr.seek(3.0)
        print(fr.tell())
    

    truncate: 截断

    with open('test.py','ab') as fa:
        fa.trundate(2)
    

    移动光标(以字符为单位)

    read
    with open('test.py','r',encoding='utf8') as fr:
        print(fr.read(3))  # 表示n个字符,不加默认读取所有  # 中文和英文都属于一个字符
    

    6.登录注册

    注册

    count = 0
    while count < 3:
        username_inp = input('请输入你的用户名:')
        pwd_inp = input('请在此输入你的密码:')
        re_pwd_inp = input('请确认你的密码:')
        
        if not pwd_inp == re_pwd_inp:
            print('两次密码输入不一致')
            count += 1
            continue
            
    	with open('user_info.txt','a',encoding='utf8') as fa:
            fa.write(f'{username_inp}:{pwd_inp}
    ')  # :表示用户名和密码的分割线 | 用户和用户的分割
            fa.flush()
            break
    

    登录

    username_inp = input('请输入你的用户名:')
    pwd_inp = input('请输入你的密码:')
    
    with open('user_info.txt','r', encoding='utf8') as fr:
        for user_info in fr:
            username,pwd = user_info.split(':')
            
            if username.strip() == username_inp and pwd.strip() == pwd_inp:   # strip去掉两端空格
                print('登录成功')
                break
                
    	else:
            print('登录失败')
    

    7.文件的修改

    严格来说文件没有修改一说,只有覆盖

    缓存文件的原理

    同时打开多个文件

    with open('test.py', 'r',encoding='utf8') as fr,/
    		open('test_swap.py','w',encoding='utf8') as fw:
    	data = fr.read()
    	data = data.replace('sb','2b')
        
        fw.write(data)
        
    import os
    
    os.remove('test.py')
    os.rename('test_swap.py')
    
    with open('test.py','r', encoding='utf8') as fr,
    		open('test_swap.py','w', encoding='utf8') as fw:
           #再大的文件都能修改
        for i in fr:
            s = '2b'
            i = i.replace('sb',s)
            fw.write(i)
            # fw.flush()  # 先保存成功再继续运行
    

    1.方法一

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

    import os
    with open('37r.txt') as fr,/
    		open('37r_swap.txt','w') as fw:
    	data = fr.read()  # 全部读入内存,如果文件很大,会很卡
    	data = data.replace('tank','tankSB')  # 在内存中完成修改
        
        fw.write(data)  # 新文件一次性写入原文件内容
        
    # 删除文件
    os.remove('37r.txt')
    # 重命名新文件名为原文件名
    os.rename('37r_swap.txt','37r.txt')
    print('done...')
    

    2.方法二

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

    import os
    
    with open('37r.txt') as fr,
    		open('37r_swap.txt','w') as fw:
    	# 循环读取文件内容,逐行修改
    	for line in fr:
            line = line.replace('jason','jasonSB')
            # 新文件写入原文件修改后的内容
            fw.write(line)
            
    os.remove('37r.txt')
    os.rename('37r_swap.txt','37r.txt')
    print('don...')
    

    总结:以读的方式打开原文件,以写的方式打开一个新文件,把原文件的内容进行修改,然后写入新文件,之后利用os模块的方法,把源文件删除,重命名新文件为原文件名,达到以假乱真的目的。

  • 相关阅读:
    Redis主从同步分析
    团队形成的四个阶段
    Firefox 按一下Alt键 出现菜单!
    Android系统手机端抓包方法
    你必须知道的EF知识和经验
    .NET异步编程之回调
    正确设置电脑虚拟内存
    Cache and Virtual Memory
    性能测试指标
    HTTP协议
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11545251.html
Copyright © 2020-2023  润新知