zoukankan      html  css  js  c++  java
  • 文件操作

    * 打开文件的模式

    模式选择

    文件的上下文管理
           with open(....)as f:
    
       文件读写模式(常用r、w模式)rwa:称纯净模式
          r   只读模式
          1.文件不存在,报错
          2.文件存在,光标在文件开头(什么都没开始读)
         w  只写模式
          1.文件不存在 自动创建新文件
          2.文件存在  先清空文件内容在执行写入
         a   只追加模式(只能在文件的末尾添加内容)
          1.文件不存在,自动创建新文件
          2.文件存在,光标直接在文件末尾
       文件操作单位
         t   文本模式(只读文本的文件)
          只能和rwa连用  ,并且不写的情况,默认是t
         b   原生的二进制
          1.只能和rwa连用
          2.该模式通常用来处理非文本文件
          3.直接存储网络上传输过来的二进制数据
    
    r 只读
    r+  读写,不创建
    w 新建只写
    w+ 新建读写
    区别:
    r+与w+ :r+读写,若文件不存在,报错
            w+可读可写,若文件不存在,创建
    
    
    
    # r+ 读写模式
    # with open(r'test', mode='r+', encoding='utf-8')as f:  # 后面参数不写,默认rt模式
    #     print(f.readable())  # 可读
    #     print(f.writable())  # 可写
    #
    #     # print(f.readline())  # 读一行
    #     print(f.read())  # 读全部
    #     # f.write('hahhas')   # 末尾添加
    
    # r+b  读写,并转换成二进制模式
    with open(r'test', mode='r+b')as f:  # 后面参数不写,默认rt模式
        print(f.readable())  # 可读
        print(f.writable())  # 可写
        # print(f.read())
    
        res = f.read()
        # print(res)
        # 1.二进制转换utf-8
        # print(res.decode('utf-8'))
        # 2.解码
        res1 = str(res, encoding='utf-8')
        print(res1)
    

    一、修改文件的两种方法

    第一种方式修改文件:

    修改文件:

    1.将数据由硬盘读到内存(读文件)

    2.在内存中完成修改(字符串的替换)

    3.再覆盖原来的内容(写文件)

    优点:硬盘上只有一个文件
    缺点:当文件过大的情况下,可能会造成内存溢出

    replace 替换

    with open(r'test02', 'r', encoding='utf-8') as f:    
        res = f.read()    
        print(res)with open(r'test02', 'w', encoding='utf-8')as f:    
            data = res.replace('jeff', 'gyy')   # 替换    
            print(data)    
            f.write(data)
    

    第二种方式修改文件:

    import os

    1.创建一个新文件
    2.读取老文件内容到内存进行修改 将修改好的内容写到新文件当中
    3.将老文件删除 将新文件的名字改成老文件
    优点:内存中始终只有一行内容,不占内存
    缺点:在某一时刻硬盘上会同时存在两个文件

    with open(r'test02', 'r', encoding='utf-8') as read_f,
            open(r'test02.swap', 'a', encoding='utf-8') as write_f:
        for line in read_f:
            new_line = line.replace('gyy', 'cjm')
            write_f.write(new_line)
    os.remove(r'test02')  # 删除老文件
    os.rename(r'test02.swap', 'test02')   # 新文件改名为老文件名字
    

    二、字符编码

    encode 编码
    decode 解码
    乱码原则:用什么编码就用什么解码

    a = "嘉"
    # 第一种编码,解码
    res = a.encode('utf-8')  # 编码
    print(res.decode('utf-8'))  # 解码
    
    # 第二种编码,解码
    res1 = bytes(a, encoding='utf-8')  # 编码二进制
    print(res1, type(res1))  # 显示编码结果
    # print(res1.decode('utf-8'))  # 解码,并显示
    
    res2 = str(res1, encoding='utf-8')  # 解码二进制
    print(res2, type(res2))
    

    三、进制转换

    # 其他进制转10进制
    dd = int('1100', 2)
    print(dd)
    
    
    # 10进制转2进制
    aa = bin(666)
    print(aa)
    # 10进制转8进制
    bb = oct(666)
    print(bb)
    # 10进制转16进制
    cc = hex(666)
    print(cc)
    
    

    四、文件内光标移动

    一: read(3):

    1. 文件打开方式为文本模式时,代表读取3个字符
    2. 文件打开方式为b模式时,代表读取3个字节

    二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

    注意:

    1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
    f.seek(offset,whence)
    offset  相对偏移量,光标移动的位数
    whence:
        0:参照文件的开头
        1:参照光标所在当前位置   只能在b模式下使用
        2:参照文件的末尾     只能在b模式下使用
    
    1. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
    import time
    with open('test.txt','rb') as f:
        f.seek(0,2)  # 光标移动
        while True:
            line=f.readline()
            if line:
                print(line.decode('utf-8'))
            else:
                time.sleep(0.2)
    

    五、截断文件

    truncate() 方法用于截断文件并返回截断的字节长度。

    指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。

    fileObject.truncate([size])
    
  • 相关阅读:
    mySQL练习题
    JAVA实现C/S结构小程序
    JavaLinkedHashSet练习
    关于Extjs删除分页后删除最后一条数据页面无效的问题。
    hibernate 插入,更新数据库错误
    错误!错误!错误!
    坑爹的oracle
    关于hibernate实体类
    第一个项目的需求分析
    Ueditor 单独使用上传图片及上传附件方法
  • 原文地址:https://www.cnblogs.com/WQ577098649/p/11887407.html
Copyright © 2011-2022 走看看