zoukankan      html  css  js  c++  java
  • day09

    文件处理

    • 什么是文件处理:修改存储的信息
    • 什么是文件:操作系统提供的虚拟存储空间

    一、打开文件

    1. 文件路径
      f=open(r'文件路径.py','r',encoding='uft8')
    2. 打开模式
      r(只读) w(只写) a(追加)

    二、修改/读取文件
    f.write('''
    上天降大任于是人也
    必先苦其心志
    劳其筋骨
    ''')
    三、保存文件
    f.flush() # 快速保存,可以不使用

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

    文件的三种打印方式

    读取/写入/追加写入

    • rt :只读 read_text 读文本内容
    f = open(r'D:D:python12期day 092 文件的三种打开模式.py', 'rt', encoding='utf8')
    f.write('gaofeng')
    data = f.read()
    print(data)
    
    • wt :只写 (w清空文件后写入),不可读
    f = open(r'D:day 09	est.py', 'wt', encoding='utf8')
    
    f.write('abc')
    
    • at: 只写入(追加写入)
    f = open(r'D:上海python12期视频python12期视频day 09	est.py', 'at', encoding='utf8')
    print(f.readable())
    print(f.writable())
    
    f.write('中')
    

    encoding指定写入和读文件的编码格式

    打开文本的两种格式:t--文本格式

    ​ b--二进制格式(一般用于图片/音频/视频的保存)

    import requests
    
    response = requests.get('http://photocdn.sohu.com/20120708/Img347586981.jpg')
    data = response.content  # 拿到图片的二进制
    print(data)
    

    判断是否可读可写

    print(f.readable())#判断是否可读
    print(f,writeable())# 判断是否可写
    
    data = f.read()  #读取所有文本的内容
    print(data)
    
    print(f.readline())# 按行读取
    print(f.readlines())#读取所有行放入列表  #比如一筐鸡蛋
    

    循环读出文本所有内容

    for i in f.read():
       print(i)
    

    循环出一行行内容;节省内存 #比如母鸡下蛋
    文本读一行少一行,每一行末尾默认有一个换行

    for i  in  f:   
       print(i)
    print('f.readline() : ', f.readline())
    
    自动拼接列表元素,一行写入
    f.writelines(['abc', 'edf', 'gbk'])
    
    w和a模式可以自动创建文件
    f = open(r'1.jpg', 'wb')
    f.write(data)
    

    绝对路径和相对路径

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

    • 绝对路径: 从盘符开始 D:上海python12期视频python12期视频day 09 est.py

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

    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
    

    文件的高级应用

    三种新的模式(可读又可写),尽量不要使用

    r只读/w清空写入/a追加写入 --> 要么只读,要么只写

    假设一个文件即可读又可写,假设写需要10s,读需要5s
    
    针对test.py,我们要写入一个国字,需要10s
    
    过了1s,我们读了这个文件,5s过后,我们看到文件只有一个中字
    
    感觉自己没写入,你会再一次写入一个国字(基于前面一个字是中字)
    
    4s过后,第一个的写入成功了,文件变成 中国 了
    
    再过6s,第二次写入一定失败
    
    以前就发生过(现在的电脑牛逼了,所以不会有这种事发生,但是还是有一定概率的)
    

    可写可读 r+

    with open('test.py', 'r+', encoding='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='utf8') as fw:
        print(fw.readable())
        print(fw.writable())
        fw.seek(0,0)
        print(fw.read())
    

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

    光标的高级应用(移动光标)
    8个进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)
    (00000000-->一个字节 00000000 00000000) --> 一个字符,对应三个字节,对应一个中文 --> utf8

    下三种移动光标的位置(以字节为单位)

    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'))
    
    tell : 告诉你当前所在位置
    with open('test.py', 'rb') as fr:
        fr.seek(3, 0)
        print(fr.tell())
    
    truncate: 截断
    with open('test.py', 'ab') as fa:
        fa.truncate(2)
    
    移动光标(以字符为单位)
    read
    with open('test.py', 'r', encoding='utf8') as fr:
        print(fr.read(3))  # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符
    

    注册登录

    # 注册
    
    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:
            #     continue  # continue一般不写在最后一行
        else:
            print('登录失败')
    
    # 一个项目从来都不会在知识点难倒你, 只会在逻辑方面难倒你(敲少了)
    

    文件的修改

    文件没有修改只有覆盖

    with open('test.py','r',encoding='utf8')as fr,
      open('test_new.py','w',encoding='utf8')as fw:   #同时打开多个文件
      
      data = fr.read()
      data = data.repalce('se','sb')
     
      fw.write(data)
      import os 
      
      os.remove('test.py')
      os.rename('test_new.py','test.py')
    
    
  • 相关阅读:
    MFC 中 Tooltip 实现的几种方式
    C++11带来的优雅语法
    socket异步编程--libevent的使用
    单元测试与解耦
    Ubuntu(Linux) + mono + jexus +asp.net MVC3
    常见算法总结
    NET里简易实现AOP
    KMP算法
    简易的集群通讯组件
    数据访问层的封装与抽象
  • 原文地址:https://www.cnblogs.com/gfhh/p/11543816.html
Copyright © 2011-2022 走看看