开发者

Python全栈之文件操作

目录
  • 1. 字典的相关函数
  • 2. 集合的操作_函数
  • 3. 文件基本操作
  • 4. 文件扩展模式
    • 小提示:
  • 总结

    1. 字典的相关函数

    字典的相关函数

    # ### 字典的相关函数
    dic = {}
    # 增
    # 1.普通方法  (推荐)
    dic["top"] = "369"
    dic["middle"] = "左手"
    dic["bottom"] = "杰克爱"
    print(dic)
    # 2.fromkeys 使用一组键和默认值创建字典
    tup = ("a","b","编程客栈c")
    # fromkeys(盛放键的容器,默认值)
    dic = {}.fromkeys(tup,None)
    print(dic)
    # 注意点 (字典中的三个键默认指向的是同一个列表)
    dic= {}.fromkeys(tup,[])
    print(dic)
    dic["a"].append(1)
    print(dic)
    # 改造
    dic = {}
    dic["top"] = []
    dic["middle"] = []
    dic["bottom"] = []
    dic["top"].append("the boy")
    print(dic)
    # 删
    dic = {'top': '369', 'middle': '左手', 'bottom': '杰克爱'}
    #pop()       通过键去删除键值对 (若没有该键可设置默认值,预防报错)
    res = dic.pop("middle")
    print(res)
    print(dic)
    # 可以给pop设置第二个参数值,以防止键不存在时报错
    res = dic.pop("middle1234","该键不存在")
    print(res)
    #popitem()   删除最后一个键值对 
    dic = {'top': '369', 'middle': '左手', 'bottom': '杰克爱'}
    res = dic.popitem()
    print(res)
    print(dic)
    #clear()  清空字典
    dic.clear()
    print(dic)
    # 改
    #update() 批量更新(有该键就更新,没该键就添加)
    # 推荐使用
    # 没该键就添加
    dic_new = {"jungle":"karsa","support":"宝蓝"}
    dic = {'top': '369', 'middle': '左手', 'bottom': '杰克爱'}
    dic.update(dic_new)
    print(dic)
    # 有该键就更新
    dic_new = {"top":"the bug","support":"xboyww","xiaozhang":"王思聪"}
    dic.update(dic_new)
    print(dic)
    # (了解)
    dic.update(ww="王文",zl="张磊")
    print(dic)
    # 查
    # get()    通过键获取值(若没有该键可设置默认值,预防报错)
    dic = {"top":"the bug","support":"xboyww","xiaozhang":"王思聪"}
    # res = dic["top123"]
    # get 在获取字典键时,如果不存在,不会发生任何报错,返回的是None
    res = dic.get("top123")
    # 可以在获取不到该键时,给与默认值提示.
    res = dic.get("top123","抱歉,该键不存在")
    print(res)
    # 其他操作
    #keys()   将字典的键组成新的可迭代对象
    dic = {"top":"the bug","support":"xboyww","xiaozhang":"王思聪"}
    res = dic.keys()
    print(res , type(res))
    #values() 将字典中的值组成新的可迭代对象 ***
    res = dic.values()
    print(res , type(res))
    #items()  将字典的键值对凑成一个个元组,组成新的可迭代对象 ***
    res = dic.items()
    print(res , type(res))
    
    # for i in res:
    	# print(i)
    for k,v in res:
    	print(k,v)
    

    2. 集合的操作_函数

    集合的相关操作 (交差并补)

    www.cppcns.com

    Python全栈之文件操作

    # ### 1.集合的相关操作 (交差并补)
    # intersection() 交集 
    set1 = {"易烊千玺","王一博","刘某PDD","王文"}
    set2 = {"倪萍","赵忠祥","金龟子大风车","小龙人","王文NXieB"}
    res = set1.intersection(set2)
    print(res)
    # 简写 &
    res = set1 & set2
    print(res)
    # difference()   差集   
    res = set1.difference(set2)
    print(res)
    #  简写 -
    res = set1 - set2
    print(res)
    #union()  并集  
    res = set1.union(set2)
    print(res)
    #  简写 |
    res = set1 | set2
    print(res)
    #symmetric_difference() 对称差集 (补集情况涵盖在其中)
    res = set1.symmetric_difference(set2)
    print(res)
    #  简写 ^
    res = set1 ^ set2
    print(res)
    
    #issubset()   判断是否是子集
    set1 = {"刘德华","郭富城","张学友","王文"}
    set2 = {"王文"}
    res = set2.issubset(set1)
    print(res)
    #  简写 
    res = set2 < set1
    print(res)
    
    #issuperset  判断是否是父集
    set1 = {"刘德华","郭富城","张学友","王文"}
    set2 = {"王文"}
    res = set1.issuperset(set2)
    print(res)
    # 简写
    res = set1 > set2
    print(res)
    #isdisjoint() 检测两集合是否不相交  不相交 True  相交False
    set1 = {"刘德华","郭富城","张学友","王文"}
    set2 = {"王文"}
    res = set1.isdisjoint(set2)
    print(res)
    # ### 2.集合的相关函数
    # 增
    #add()    向集合中添加数据
    # 一次加一个
    set1 = {"王文"}
    set1.add("王伟")
    print(set1)
    #update() 迭代着增加
    # 一次加一堆
    set1 = {"王文"}
    lst = ["a","b","c"]
    lst = "ppp" # 迭代这添加,无序,会自动去重
    set1.update(lst)
    print(set1)
    # 删
    setvar = {'刘某PDD', '小龙人','倪萍', '赵忠祥'}
    #clear()   清空集合
    # setvar.clear()
    # print(setvar)
    #pop()     随机删除集合中的一个数据
    # res = setvar.pop()
    # print(res)
    # print(setvarNXieB)
    #discard() 删除集合中指定的值(不存在的不删除 推荐使用) ***
    setvar.discard("刘某PDD111111") # success
    # setvar.discard("刘某PDD")
    # print(setvar)
    #remove()  删除集合中指定的值(不存在则报错) (了解)
    # setvar.remove("刘某PDD111") # error
    # setvar.remove("刘某PDD")
    # print(setvar)
    # ### 3.冰冻集合 (额外了解)
    """frozenset 单纯的只能做交差并补操作,不能做添加或者删除的操作"""
    lst = ["王文","宋健","何旭彤"]
    fz1 = frozenset(lst)
    print(fz1, type(fz1))
    
    # 不能再冰冻集合中添加或者删除元素
    # fz1.add(1)
    # fz1.update("abc")
    # fz1.discard("王文")
    # 冰冻集合只能做交差并补
    lst2 = ["王文","王同培","刘一缝"]
    fz2 = frozenset(lst2)
    print(fz2, type(fz2))
    # 交集
    res = fz1 & fz2
    print(res)
    # 遍历冰冻集合
    for  i in fz2:
    	print(i)
    

    3. 文件基本操作

    # ### 文件操作
    """
    语法:
    fp = open(文件,模式,编码集)
    fp => 文件的io对象 (文件句柄)
    i => input  输入
    o => outpur 输出
    fp.read()  读取文件内容
    fp.write() 写入文件的内容
    """
    # 1.文件的写入操作
    # (1) 打开文件
    fp = open("ceshi1.txt",mode="w",encoding="utf-8")# 打开冰箱门
    # (2) 写入内容
    fp.write("把大象怼进去") # 把大象怼进去
    # (3) 关闭文件
    fp.close() # 把冰箱门关上
    # 2.文件的读取操作
    # (1) 打开文件
    fp = open("ceshi1.txt",mode="r",encoding="utf-8")
    # (2) 读取内容
    res = fp.read()
    # (3) 关闭文件
    fp.close()
    print(res)
    # 3.文件存储二进制字节流
    """
    二进制字节流:`用于传输数据或者存储数据的一种数据格式
    b"abc" b开头的字节流要求数据只能是ascii编码中的字符,不能是中文
    # 将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)
        #encode() 编码  将字符串转化为字节流(Bytes流)
        #decode() 解码  将Bytes流转化为字符串
    """
    data = b"abc"
    data = "中文".encode("utf-8")
    print(data,type(data))
    res = data.decode("utf-8")
    print(res,type(res))
    # utf-8下 一个中文占用3个字节
    data = "中文".encode("utf-8")
    # 计算字节总大小
    print(len(data))
    # 把中字这个字节流进行反解恢复成原来中的字符 "中"
    res = b"\xe4\xb8\xad".decode()
    print(res)
    # 4.文件存储二进制的字节流
    """如果存储的是二进制字节流,指定模式wb,不要指定encoding编码集,否则报错""" 
    fp = open("ceshi2.txt",mode="wb")
    strvar = "红鲤鱼绿鲤鱼与驴".encode("utf-8")
    fp.write(strvar)
    fp.close()
    # 5.文件读取二进制的字节流
    fp = open("ceshi2.txt",mode="rb")
    res = fp.read()
    fp.close()
    print(res)
    print(res.decode())
    # 6.复制文件
    """所有的图片,音频,视频都需要通过二进制字节流来进行存储传输."""
    # 先把原文件的二进制字节流读取出来
    # 相对路径找集合.png 相对于当前3.py这个文件
    # fp = open("集合.png",mode="rb")
    # 绝对路径找集合.png 从最底层一级一级往上找
    fp = open(r"D:\python32_python\day01\集合.png",mode="rb")
    res = fp.read()
    fp.close()
    # 计算文件中的字节个数 => 文件大小
    print(len(res))
    # 在把二进制字节流写入到另外一个文件中,相当于复制
    fp = open("集合2.png",mode="wb")
    fp.write(res)
    fp.close()
    

    4. 文件扩展模式

    文件操作的扩展模式

    # ### 文件操作的扩展模式
    """
    # (utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节)
        #read()		功能: 读取字符的个数(里面的参数代表字符个数)
    		注意:从当前光标往右边读
        #seek()		功能: 调整指针的位置(里面的参数代表字节个数)
    		seek(0)   把光标移动到文件的开头
    		seek(0,2) 把光标移动到文件的末尾
        #tell()		功能: 当前光标左侧所有的字节数(返回字节数)
    """
    # 1.r+ 先读后写
    """
    fp = open("ceshi3.txt",mode="r+",encoding="utf-8")
    # 先读
    res = fp.read()
    # 在写
    fp.write("ab")
    # 在读
    fp.seek(0) # 通过seek把光标移动到开头
    print(fp.read())
    fp.close()
    """
    # 2.r+ 先写后读
    """
    fp = open("ceshi3.txt",mode="r+",encoding="utf-8")
    # 移动光标到最后,否则r模式下,原字符会被覆盖
    fp.seek(0,2)
    # 先写
    fp.write("cd")
    # 把光标移动到文件的开头
    fp.seek(0)
    # 在读
    res = fp.read()
    print(res)
    fp.close()
    """
    # 3.w+ 可读可写,清空重写(默认可以创建新的文件)
    """
    fp = open("ceshi4.txt",mode="w+",encoding="utf-8")
    fp.write("abc")
    fp.seek(0)
    print(fp.read())
    fp.close()
    """
    # 4.a+ 可读可写,追加写入 (默认可以创建新的文件)
    """
    fp = open("ceshi5.txt",mode="a+",encoding="utf-8")
    fp.write("def")
    # 读内容
    fp.seek(0)
    print(fp.read())
    fp.close()
    """
    # 5.r+和a+区别
    """
    r+模式基于当前光标所在位置进行写入覆盖
    a+模式会强制把光标放到文件末尾进行追加写入
    """
    """
    # fp = open("ceshi5.txt",mode="r+",encoding="utf-8")
    fp = open("ceshi5.txt",mode="a+",encoding="utf-8")
    fp.seek(3) # 从头数 3个字节的位置
    # fp.write("zxc") # 模式会强制把光标放到文件末尾进行追加写入
    print(fp.read())
    fp.close()
    """
    # 6.seek,tell,read之间的使用
    fp = open("ceshi5.txt",mode="r+",encoding="utf-8")
    fp.seek(4)
    # tell 当前光标左边所有内容的字节数
    res = fp.tell()
    print(res)
    # 在r+模式下 read(2) 代表读取2个字符 在rb模式下 read(2) 代表读取2个字节
    fp.read(2) # 当前光标往右所有的字符内容
    print(fp.tell())
    fp.close()
    # 7.注意点 (seek在移动时,又可能移动到某个汉字的字节中间,导致原字节无法解析)
    """
    fp = open("ceshi6.txt",mode="r+",encoding="utf-8")
    fp.seek(3)
    print(fp.read())
    fp.close()
    # print("你".encode())
    # b'\xe4\xbd\xa0'
    """
    # 8.with语法 自动实现文件关闭操作
    # 方法一.读取二进制字节流
    """
    with open("集合2.png",mode="rb") as fp:
    	res = fp.read()
    with open("集合3.png",modehttp://www.cppcns.com="wb") as fp:
    	fp.write(res)
    """
    # 方法二.继续简化
    with open("集合3.png",mode="rb") as fp1 , open("集合4.png",mode="wb") as fp2 :
    	res = fp1.read()
    	fp2.write(res)
    

    小提示:

    字符串、列表、元组用+做一个拼接
    集合无序去重的
    如果这个数据不想让别人任意修改,就把这些集合给冰冻起来
    open一个类,来创建一个对象
    decode(),括号里面不写,默认是utf-8
    w模式,如果文件已经存在,也是先清空然后在写入内容 
    a模式,只能追加数据,不能读取数据  a+可以读取数据,读取数据不受影响,seek可以用(会强制把光标放到文件末尾进行追加写入,用seek移动光标也是没有用的)
    seek移动字节的时候还是应该慎用,因为一个中文字符占3个字节,一个应为字符占用一个字节,如果一个中文没有截取完整则会报错
    seek(0)  seek(0,2) 还有纯英文的 纯中文的文件使用seek
    事实上,在移动我们的内容的位置用的不是seek、而是通过read readline等
    文件,后面的的那些函数来实现的
    关闭文件这个操作必须要写
    

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜