zoukankan      html  css  js  c++  java
  • day9:文件相关操作&文件扩展模式&文件相关函数

    文件的操作

    # 文件的写入
    # 1.打开文件
    fp = open("ceshi1.txt",mode="w",encoding="utf-8") # 把冰箱门打开
    
    # 2.写入内容
    fp.write("把大象塞进去") # 把大象放进去
    
    # 3.关闭文件
    fp.close() # 把冰箱门关上
    # 文件的读取
    # 1.打开文件
    fp = open("ceshi1.txt",mode="r",encoding="utf-8") #1.打开冰箱门
    
    # 2.读取内容
    res = fp.read() # 把大象拿出来
    print(res)
    
    # 3.关闭文件
    fp.close() # 把冰箱门关上

     字节流

    字节---->bytes---->是用来传输或者存储的数据格式

    例如:b'1234' b"abcd",范围只能是ascii编码

    形如b"我爱你",这种b后面带中文的,是不可以的

    如果是中文使用encode 和 decode 来进行转换;

    将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)

    encode() 编码 将字符串转化为字节流(Bytes流)

    decode() 解码 将Bytes流转化为字符串

    strvar = "我爱你"
    # encode 编码 -> 变成二进制字节流
    res = strvar.encode("utf-8")
    print(res , type(res)) # b'xe6x88x91xe7x88xb1xe4xbdxa0' <class 'bytes'>
    
    # decode 解码 =>二进制字节流恢复成原来的字符串
    res2 = res.decode("utf-8")
    print(res2 , type(res2)) # 我爱你 <class 'str'>

    存储二进制字节流

    # 存储二进制字节流
    """不需要指定encoding编码集,否则报错"""
    fp = open("ceshi2.txt",mode="wb")
    fp.write(strvar2)
    fp.close()

    读取二进制字节流

    # 读取二进制字节流
    fp = open("ceshi2.txt",mode="rb")
    res = fp.read()
    fp.close()
    print(res) # b'xe6x88x91xe7x88xb1xe4xbdxa0'
    # 通过decode反解出字符串
    strvar = res.decode()
    print(strvar) # 我爱你

    复制图片也是要用到rb和wb的

    # 复制图片
    """图片,音频,视频"""
    # 1.读取原图片所有的内容
    fp = open("集合.png",mode="rb")
    res = fp.read()
    fp.close() 
    
    # 2.把读取的内容存储到另外一个文件
    # fp = open("集合2.png",mode="wb")
    # 指定绝对路径(完整路径)
    fp = open(r"E:python31day8集合3.png",mode="wb")
    fp.write(res)
    fp.close()

    文件的扩展模式

    1.r+ 先读后写

    # 1.r+ 先读后写
    fp = open("ceshi3.txt",mode="r+",encoding="utf-8") 
    
    # 先读
    res = fp.read()
    print(res)
    
    # 后写
    fp.write("1234")
    
    # 再读
    fp.seek(0) # 调整光标位置在开头
    res = fp.read()
    print(res)
    fp.close()

    2.r+ 先写后读

    # 2.r+ 先写后读
    
    fp = open("ceshi3.txt",mode="r+",encoding="utf-8")
    fp.seek(0,2) # 调整光标位置在末尾
    fp.write("123")
    
    fp.seek(0)
    res = fp.read()
    print(res)
    fp.close()

    3.w+ 可读可写

    # 3.w+ 可读可写
    fp = open("ceshi4.txt",mode="w+",encoding="utf-8")
    fp.write("abc")
    
    fp.seek(0)
    res = fp.read()
    print(res)
    fp.close()

    4.a+ 可读可写(追加写)

    # 4.a+ 可读可写
    fp = open("ceshi5.txt",mode="a+",encoding="utf-8")
    fp.write("123")
    
    fp.seek(0)
    res = fp.read()
    print(res)
    
    # a模式在写入内容时,会强制把光标移动到最后
    fp.seek(1) # 虽然移到了索引为1的位置,但是在a+模式下,会强制把光标移到最后
    fp.write("abc")
    
    fp.close()

    r+和a+的区别:a+是追加写,而r+只会在光标位置后写,不会像a+一样强制将光标拽到最后

    文件的三个函数

    '''原文件内容:窗前明月光,疑是地上霜'''
    fp = open("ceshi2.txt",mode="r+",encoding="utf-8")
    res = fp.read(3)
    print(res) # 床前明
    
    
    fp.seek(6) # 注意:seek(6)是从开始位置移动6个字节,并非6个字符!!
    print(fp.read(1))
    
    # 计算文件指针左侧所有的字节数
    res = fp.tell() # tell计算的也是字节数,并非字符数
    print(res)
    fp.close()

    要注意:seek(6)是从开始位置移动6个字节,并非6个字符

        tell()统计的也是指针左侧所有的字节数,并非字符数

        seek在移动中文的时候,有可能报错。比如一个汉字占3个字节,而你却seek(2)

    with语法的使用

    # with语法的使用 (close操作with语法可以自动实现)
    with open("集合.png",mode="rb") as fp:
        res = fp.read()
    
    # 赋予绝对路径
    with open(r"E:python31day8集合4.png",mode="wb") as fp:
        fp.write(res)
    
    # 继续优化 合并with
    with open("集合.png",mode="rb") as fp1 ,  open(r"E:python31day8集合5.png",mode="wb") as fp2:
        res = fp1.read()
        fp2.write(res)

    close:文件关闭的意义

    # close 文件关闭的意义
    """
    刷新缓冲区 flush
        # 当文件关闭的时候自动刷新缓冲区
        # 当整个程序运行结束的时候自动刷新缓冲区
        # 当缓冲区写满了  会自动刷新缓冲区
        # 手动刷新缓冲区
    """
    fp = open("ceshi6.txt",mode="r+",encoding="utf-8")
    fp.write("zzz")
    # 手动把缓冲区里面的内容写入文件当中
    fp.flush()
    
    # 制造一个死循环,让其无法执行close函数
    while True:
        pass
    
    fp.close()

    文件的相关函数

    1.readable和writable

    fp = open("ceshi6.txt",mode="a+",encoding="utf-8")
    #readable()  功能: 判断文件对象是否可读
    res = fp.readable()
    print(res)
    
    #writable()  功能: 判断文件对象是否可写
    res = fp.writable()
    print(res)

    2.readline 读取一行文件内容

    """
    原文件内容:
    床前明月光
    疑是地上霜
    举头望明月
    低头思故乡
    """
    
    """
    参数 > 当前行字符总个数 => 以当前行读取
    参数 < 当前行字符总个数 => 以参数的大小来读取字符的个数
    默认readline 读取一行
    """
    
    with open("ceshi7.txt", mode="r+", encoding="utf-8") as fp:
        res = fp.readline(3000)
        print(res)
        # 文件对象fp也是一个可迭代对象
        '''在遍历文件对象的时候,默认一次拿一行'''
        for i in fp:
            print(i)

    3.用readline读取文件的所有内容

    # readline读取所有内容
    with open("ceshi7.txt",mode="r+",encoding="utf-8") as fp:    
    
        # 先读取一行
        res = fp.readline()
        # 判断是不是空
        while res:
            print(res)
            res = fp.readline()

    4.readlines()  功能:将文件中的内容按照换行读取到列表当中

    #readlines()    功能:将文件中的内容按照换行读取到列表当中
    lst_new = []
    with open("ceshi7.txt",mode="r+",encoding="utf-8") as fp:    
        lst = fp.readlines()
        print(lst) # ['	窗前明月光
    ', '疑是鞋两双		
    ', '		举头王明月
    ', '	低头看裤裆']
        for i in lst:        
            lst_new.append(i.strip())
    
    print(lst_new)     # ['窗前明月光', '疑是鞋两双', '举头王明月', '低头看裤裆']

    5.writelines() 功能:将内容是字符串的可迭代性数据写入文件中 

    #writelines()   功能:将内容是字符串的可迭代性数据写入文件中 参数:内容为字符串类型的可迭代数据
    
    """可迭代型数据(容器类型数据,range对象,迭代器)"""
    lst = ["春眠不觉晓
    ","处处蚊子咬
    ","夜来大狗熊
    ","一个也跑不了
    "]
    lst = [1,2,3,4]  # error 列表中的元素必须是字符串类型,而非数字类型
    with open("ceshi8.txt",mode="w",encoding="utf-8") as fp:
        fp.writelines(lst)

    6.truncate() 功能: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)

    #truncate()     功能: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)
    with open("ceshi7.txt",mode="r+",encoding="utf-8") as fp:
        fp.truncate(9) # 9代表9个字节,而不是9个字符
  • 相关阅读:
    Linux初级知识_04 -- 目录结构与目录管理
    查找无限整数序列的第n位1,2,3,4,5,6,7,8,9,10,11,...
    谷歌面试题:在半径为1的圆中随机选取一点
    FtpClient 调用storeFile 抛出 java.net.SocketException异常
    CountDownLatch 使用
    软件版本号比较 java工具类
    pcm文件转wav C语言
    unimrcp更改安装目录
    xpath学习记录
    jackson 实体转json 为NULL或者为空不参加序列化
  • 原文地址:https://www.cnblogs.com/libolun/p/13311375.html
Copyright © 2011-2022 走看看