• python文件操作


    python文件操作

    目录:

    1.文件读写  #文件两种类型(文本、二进制)

      读写文本文件:read  全部读出,read(n) 一次读n  w:写   r:读

      读写二进制文件(案例:读取图片、视频拷贝(边读边写)):rb 读  、wb 写、ab 追加

    2.文件与目录的操作(os、shutil模块)

      查看当前目录:os.getcwd()

      切换目录:os.chdir()

      显示当前目录下的内容:os.listdir()

      判断是目录还是文件:目录:os.path.isdir     文件:os.path.isfile

      新建目录:新建多级目录:os.makedirs      新建单个目录:os.mkdir

      删除目录:os.rmdir #只能删除空目录      shutil.rmtree:删除目录(包括非空目录)

      移动文件:shutil.move

      复制文件:shutil.copy #只复制文件内容     shutil.copy2 #复制文件所有,包括修改的时间等

    3.文件序列化(pickle、shelve、json模块) 

       

    1.文件读写

      1.1读写文本文件

    #文本文件读写
    #文件写w:
    import os
    with open("1.txt","w") as f:    #文件名可写相对路径,也可写绝对路径;在当前文件下创建了1.txt
        f.write("胜多负少")
        f.write("12365")        ##python写文件时默认按自身的操作系统编码,中文———GBK  英文————utf-8
        f.write("fsfsdf")
    with open("2.txt","w",encoding="utf-8") as f:   #编码:以ANSI格式编码(默认)
        f.write("胜多负少
    ")
        f.write("12365
    ")
        f.write("fsfsdf
    ")
    #文件读r:
    with open("2.txt","r",encoding="utf-8") as f:
        txt=f.read(2)   #一次读2个字符,默认全读
        print(txt)
        t2=f.read() #会接着上面读过的位置开始往下读
        print(t2)
    with open("2.txt","r",encoding="utf-8") as f:
        t3=f.readlines()    #readlines()按行读取,读取完以列表的形式显示
        print(t3)
    with open("2.txt","r",encoding="utf-8") as f:
        t4=f.readline()    #readline()按行读取,一次读取一行
        print(t4)
    #文件追加a:
    with open("2.txt","a",encoding="utf-8") as f:
        f.write("胜多负少
    ")
        f.write("12365
    ")
        f.write("fsfsdf
    ")
    
    with open("2.txt",encoding="utf-8") as f:
        while True:     #循环遍历出文件内容,一次读取一行
            txt=f.readline()
            if txt:    #读取的文件不为空继续打印,当读取的内容为空时(即为假),跳出循环
                print(txt)
            else:
                break

    1.2读写二进制文件

    #二进制文件操作
    print("1.读写二进制文件")  
    """
    with open("1.jpg",'rb') as f:   #读取图片
        t=f.read(3) #分析图片的二进制格式(用二进制工具打开),可以看到,jpg图片的标识头为:ffd8ff
        if t==b'xffxd8xff':
            print("这是一个图片")
        print(t,type(t))
    with open("1.jpg",'rb') as f:
        t=f.read()
    with open("2.jpg","wb") as f:
        f.write(t)
    """
    #视频拷贝(边读边写)
    with open("1.mp4","rb") as f:
        with open("2.mp4","ab") as f2:
            while True:
                txt=f.read(1024)
                if txt:
                    f2.write(txt)
                else:
                    print("文件拷贝完毕!")
                    break
        

    2.文件与目录的操作(os、shutil模块)

    #python 文件与目录操作
    import os,shutil
    print("查看当前目录:")
    print(os.getcwd())
    print("切换目录:")
    os.chdir("F:\pythonstudy")
    print(os.getcwd())
    print("显示当前目录下的内容:")
    print(os.listdir())     #显示当面目录下的所有文件,以列表的形式显示
    print(os.listdir("F:\pythonstudy\lesson7"))   #显示指定目录下的内容
    print("判断是目录还是文件:") #返回True或者False
    print(os.path.isdir("lesson7"))
    print(os.path.isfile("lesson7\1.txt"))
    print(os.path.isdir("lesson7\1.txt"))
    #新建目录mkdir/makedirs:
    print("创建目录mkdir/makedirs:")
    #os.mkdir("999")    #mkdir创建单个目录
    #os.makedirs("888/666/22")    #makedirs创建多级目录
    #删除目录
    #os.rmdir("999") #rmdir只能删除空目录
    #shutil.rmtree("888")   #rmtree可以删除非空目录
    #删除文件
    #os.remove("ss.txt")
    #移动文件
    #shutil.move("dd.txt","F:\pythonstudy\lesson7")
    #shutil.move("1.jpg","2.jpg")  #改名
    #复制文件
    print(os.chdir("F:\pythonstudy\lesson7"))
    shutil.copy("dd.txt","ff.txt")
    shutil.copy2("dd.txt","mm.txt")
    #组合路径
    path="F:\pythonstudy\lesson7"
    f="1.jpg"
    print(os.path.join(path,f))
    #拆分路径
    #以文件目录拆分(默认以最后一个"\"分隔)
    print(os.path.split("F:\pythonstudy\lesson7\1.jpg"))
    #以盘符进行拆分
    print(os.path.splitdrive("F:\pythonstudy\lesson7\1.jpg"))

    3.文件序列化(pickle,shelve,json模块)

    pickle: 

      只能用二进制读写,python下所有的类型都可存  缺点:只支持同版本,不能跨平台

      pickle可以把对象以文件的形式存放在磁盘,

      pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化。

      pickle序列化后的数据,可读性差,人一般无法识别

      pickle.dump(obj, file[, protocol]),序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。             protocol的值还可以是1或2,表示以二进制的形式序列化。

      pickle.load(file),反序列化对象。将文件中的数据解析为一个Python对象

    import random 
    import pickle
    """
    #使用pickle模块将数据对象保存到文件
    import  pickle
    data1={'a':[1,2.0,3,4],
            'b':('string',u'sdfsf'),
            'c':None} 
    with open("data.pkl",'wb') as f:
        pickle.dump(data1,f)
    #获取保存文件的内容
    with open("data.pkl",'rb') as f:
        b=pickle.load(f)
        print(b)
    """
    """    
    print("1.pickle模块")
    try:
        with open("cjb","rb") as f:
            cjb=pickle.load(f)
            print("结果已加载")
    except FileNotFoundError:
        cjb=[]
    for i in range(5):
        name=input("name:")
        cj=random.randint(50,100)
        cjb.append([name,cj])
    print(cjb)
    with open("cjb","wb") as f:
        pickle.dump(cjb,f)
        print("结果已保存")
    """ 

    shelve:

      在shelve模块中,key必须为字符串

      pickle和json可以dump多次但只能load一次(因为先前的数据已经被后面dump的数据覆盖掉了),如果想要实现dump多次不被覆盖,就可以想到使用shelve模块

    import shelve
    import datetime
    """
    #数据存储(数据持久化)
    info = {'name': 'bigberg', 'age': 22}
    name = ['Apoll', 'Zous', 'Luna']
    t=datetime.datetime.now()
    with shelve.open('shelve.txt') as f:
        f['name']=name  #持久化列表
        f['info']=info   #持久化字典
        f['time']=t     #持久化时间类型
    """
    #数据读取(get获取数据)
    with shelve.open("shelve.txt") as f:
        n=f.get('name')
        i=f.get('info')
        now=f.get('time')
    print(n)
    print(i)
    print(now)
    """

     json:

      将字符串形式的json数据转化为字典,也可以将Python中的字典数据转化为字符串形式的json数据

      JSON的数据格式其实就是python里面的字典格式

      json.dumps()把一个Python对象编码转换成Json字符串

      json.loads()把Json格式字符串解码,转换成Python对象

      元组(被转换成列表),集合不能被json序列化,所有key必须都是字符串(强行转,易失真);

      转出来都是字符串;常用来处理字典

    json处理整数、小数、字符

     

    json处理元组,元组被转换为列表

      

    json不能处理集合

      

    json处理字典,字典的key会被转换为字符串

      

     json.dump,json.load的用法

    import json
    str1="安抚家属的快感的降幅高达"
    str2="123"
    str3=1.23
    str4=[1,2,3]
    str5=(3,6,8)
    str6={"x":1,"y":2}
    str7={1:"a",2:"b"}
    """
    with open("123.txt","w") as f:
        json.dump(str1,f)   #汉字存储是以unicode编码存储
      
    with open("123.txt") as f:
        print(json.load(f))
    """  
    """
    with open("123.txt","w") as f:
        json.dump(str2,f)  
     
    with open("123.txt") as f:
        print(json.load(f))
    """
    
    
    with open("123.txt","w") as f:
        json.dump(str3,f)   
    
    with open("123.txt") as f:
        print(json.load(f))
    """  

    """
    with open("123.txt","w") as f:
    json.dump(str5,f) #元组被序列化会被转成列表,然后存储

    with open("123.txt") as f:
    print(json.load(f)) #元组反序列化的结果是列表
    """

      

  • 相关阅读:
    SQL如何对时间戳字段按日期排序
    PHP书写SQL换行
    SQL修改字段
    SQL新增一个字段
    HTML加JS实现点击切换“观看”与“收起”效果切换
    盐:深沉的慢动作 让电影“支离破碎”
    笔:最终会走在一起吗
    笔:那个下午
    关于国内安装百夫长开源网站统计进度过慢的问题
    Java Web系列之JDBC
  • 原文地址:https://www.cnblogs.com/yuzly/p/10316385.html
Copyright © 2020-2023  润新知