zoukankan      html  css  js  c++  java
  • python基础语法4 文件处理

    1、什么是文件

    操作系统提供给你操作硬盘的一个工具

    2、为什么要用文件
    因为人类和计算机要永久保存数据

    3、怎么用文件

    相对路径:a.txt # 必须与当前py文件在同一级目录
    绝对路径:D:项目路径python13期day07a.txt

    读文件

    f=open('a.txt')
    
    print(f.readable()) #判断当前文件是否可读   True
    print(f.writable()) #判断当前文件是否可写  False
    
    f.close()   #回收操作系统的资源
    #可以实现换行   以下为相对路径     同时读和写操作
    with open('a.txt',mode='r')as rf,
        open('a.txt',mode='w')as wf:    # with会自动帮你回收操作系统的资源,无需自己操作,关闭
        print(rf.readable())    #True
        print(rf.writable())    #False
    
    #r进行转义     以下为绝对路径
    with open(r'D:oldboy_edupython_codeday7a.txt',encoding='utf-8')as f:    # 不加encoding = 'utf-8'出现乱码,原因不明
        print(f.read())     #读取文件

    th.jpg(原素材)lixiaoran.png(生成图片)

    # 默认打开文件的模式:rt  read text   和r相同
    # rb  read bytes
    with open('a.txt',mode='rb')as f:       # 内容为:今天天气真好
        print(f.read())
    # b'xe4xbbx8axe5xa4xa9xe5xa4xa9xe6xb0x94xe7x9cx9fxe5xa5xbd'
    
    #读取jpg图片为二进制,再把二进制数据写入png文件,生成新的图片
    with open(r'th.jpg',mode='rb')as rf,
            open('lixiaoran.png',mode='wb')as wf:
        lixiaoran = rf.read()
        print(lixiaoran)
        wf.write(lixiaoran)

    打开文件的三种模式:
    r :  1、只读  2、如果文件不存在,会报错
    w:(慎用)  1、只写  2、如果文件不存在,则新建一个文件写入数据  3、如果文件内存在数据,会将数据清空,重新写入
    a:  1、追加写  2、如果文件内存在数据,会在已有数据的后面追加数据  3、如果文件不存在,则新建一个文件写入数据
    处理文件的模式:

      t:文本模式
        只能与rwa连用
        默认情况下,是rt模式

      b:bytes模式
        只能与rwa连用
        处理二进制数据

    """

    文件处理的内置方法:
      读:
      f.read() # 读文件;一次性读出所有数据
      f.readline() # 一次读一行
      f.readlines() # 将数据全部读入内存,以换行符分隔,存入列表
      f.readable() # 是否可读
      写:
      f.write # 写文件
      f.writeable # 是否可写
      f.writelines() # for + f.write()

      for line in f:
        pass
    r:防止转义

    with open(r'dir.txt','r',encoding='gbk')as f:
        print(f.readable())
    print(f.read())   # 读文件;一次性读出所有数据
    print(f.readline()) # 执行一次,打印一行内容
    print(f.readlines())    #将数据全部读入内存,以换行符分隔,存入列表
    print(f.readable()) for i in f:  # f为句柄,可迭代对象,会以 为结束,一行行打印 print(i) with open('b.txt', 'w', encoding='gbk')as f: f.write("上海校区第一帅-sean")  # 写文件 f.writelines(["上午没翻车 ",'我很高兴']) # 将数据全部读入内存,以换行符分隔,存入列表    # writelines 可以写入列表,可迭代对象。类似 for + f.write()           with open(r'diraaaaa.txt','a',encoding='gbk')as f:  #追加写入 print(f.writable()) f.write(" 翻车是不可能的")

     注意:在windows系统下,用open函数打开txt文档标注编码,默认为gbk。(下面方法可以显示当前编码方式)

    with open(r'b.txt','r',encoding='utf-8')as f:
        print(f.encoding)  #显示当前编码格式

     

    打开文件模式扩展

    r,w,a     #纯净模式
    r+,w+,a+  # 可读可写 (除了可读·可写之外剩下都是自己的特性)

    注:写完必须关了文件,才能读,否则在内存,不再硬盘

    with open('abc.txt','r+',encoding='utf8')as f:
        f.write('天气正好')  #如果没有文件,则报错
        print(f.readable())
        print(f.writable())
    with open('abc.txt','w+',encoding='utf8')as f:
        f.write('天气不太好')  #没有文件则创建
        print(f.read())
        print(f.readable())
        print(f.writable())
    with open('a.txt','a+',encoding='utf8')as f:
        f.write('哦哟,天气好')
        # print(f.read())
        print(f.readable())
        print(f.writable())

    文件内光标的移动:

    """
    f.seek(offset,whence)
    offset: 相对偏移度 (光标移动的位数)针对的是字节
    whence:指定光标位置从何开始,默认是0
      0:从文件开头
      1:从当前位置
      2:从文件末尾

    补充:
      utf-8:
      中文是3个bytes
      英文是1个bytes
      gbk:
      中文是2个bytes
      全角英文2bytes,半角英文是1个bytes

    open函数不设置encoding,默认是gbk
    与encode一毛钱都没有,encoding只是一个参数

    如果rt打开文档,若whence为1,2,必须是(0,1),(0,2)!

    rt模式下,除了read里面的参数是针对字符,其他都是针对字节

    rb模式下,全部正对字节
    """

    with open('a.txt','r',encoding='utf8')as f:     #文件内容为'哦哟天气好啦啦啦'
        print(f.tell()) #0
        print(f.read(2))    #哦哟
        print(f.tell())     #6
        f.seek(6,0)     #光标从头开始,前进6个bytes,也就是2个中文字符
        print(f.tell())  # 6
        print(f.read(1))    #读取光标后第一个字符   '天'
    
    with open('a.txt','r')as f: #不写encoding默认gbk,因为open调用的是window操作系统,默认为gbk
        f.seek(4,0)
        print(f.read(2).encode('utf-8'))    #把内存unicode转为utf-8,2个字符也就是6个直接
    b'xe6x91x95xe6xbexb6'
    
    with open('a.txt','rb')as f:
        print(f.read(4).decode('utf-8'))   #read 读取的是字节,文件为utf-8模式,以'utf8'格式解码
        f.seek(6,1)
        print(f.read(3).decode('utf-8'))
        f.seek(-3,2)
        print(f.tell())
        print(f.read(3).decode('utf-8'))

    获取文件实时动态脚本

    以下为获取文件实时动态脚本,优先打开进行捕获动态

    import time
    with open('c.txt','r',encoding='utf8')as f:
        f.seek(0,2) ## 以文件末尾为参照点,移动0位
        while True:
            time.sleep(1)
            res=f.readline()    #一次读一行
            if res: # 如果你读出数据了,就执行下面的代码块
                print(f'录入记录:{res}')

    以下为生成文件动态程序

    import time
    res = time.strftime('%Y-%m-%d %H:%M:%S')
    with open(r'a.txt','a',encoding='utf-8')as f:
        for i in range(10):
            f.write(f'{res}:马上要学函数了,有点难,怎么办
    ')

    运行生成文件动态后,获取文件实时动态脚本自动捕获输入命令

    修改文件内容:

    方法1:

    with open('a.txt','r',encoding='utf8')as f:
        data=f.read()
        print(data)
        print(type(data))
    with open('a.txt','w',encoding='utf8')as f:
        res=data.replace('家乐福','沃尔玛')
        f.write(res)

    方法2:

    import os
    with open('b.txt','r',encoding='utf8')as rf,
        open('b_wap.txt','w',encoding='utf8')as wf:
        data=rf.read()
        res=data.replace('小明','小红')
        wf.write(res)
    
    os.remove('b.txt')
    os.rename('b_wap.txt','b.txt')

    方法3:

     

    截段  truncate(6):

    with open(……)as f:
        f.truncate(6)    #截段6个字节

    f.flush()  # 将内存中数据刷到硬盘

    with open(…'r'…)as rf,
        open(…'a'…)as wf:
         wf.write('ab')
         wf.flush()    # 强制刷到硬盘
         rf.read()    # 不关闭可以直接读
  • 相关阅读:
    js正则表达式常见规则整理
    struts2标签 遍历map集合
    RabbitMQ面试问题
    vue基础学习
    flowableの历史查询
    flowableの日志打印
    flowableのID生成器
    flowableの流程发起人
    SpringBoot+Dubbo(XML配置方式)
    linux安装zookeeper伪分布式
  • 原文地址:https://www.cnblogs.com/ludingchao/p/11815321.html
Copyright © 2011-2022 走看看