zoukankan      html  css  js  c++  java
  • python学习笔记,视频day17、18-文件处理

    文件处理基本流程

      1)打开文件,找到文件句柄并赋值给一个变量

      2)通过句柄对文件进行操作

      3)关闭文件

    1、文件格式为“utf-8”

    #新建一个文件,命名锦觅,文件内容如下:
    香蜜沉沉烬如霜
    哪吒
    陈情令
    亲爱的
    热爱的
    #'gbk' codec can't decode byte 0xac in position 14: illegal multibyte sequence,锦觅文件中字符串存在硬盘上是二进制,字符串到二进制中间有字符编码,看右下角是utf-8
    #pycharm3是utf-8编码,但是open函数不是,该函数会检索当前系统的编码,当前是windows系统,为gbk;这次打开以文件存的编码打开;mac是utf-8
    #若文件是gbk格式存在硬盘,打开也应是gbk
    #打开是解码过程,存内存是编码
    #在锦觅同一个路径再建一文件,内容如下,运行
    f=open("锦觅",encoding="utf-8")#得到一个文件句柄赋值给f
    data=f.read()
    print(data)
    f.close()
    #香蜜沉沉烬如霜
    # 哪吒
    # 陈情令
    # 亲爱的
    # 热爱的

    2、文件格式为“gbk”

    #新建文件名“呼家楼”,格式为gbk
    f=open("呼家楼")
    data=f.read()
    print(data)
    #蒲黄榆

    3、f=open("锦觅",encoding="utf-8"),解释如下:

    f是句柄open是应用程序,通过操作系统要了句柄;举例:f相当于渔网,文件相当于一堆鱼,去操作系统捞鱼,f就相当于文件句柄;f.read()相当于捞鱼;f是open函数程序提供,open去调操作系统,实际是由操作系统去返回f,f去操作硬盘f.close()相当于回收渔网;若一直打开不关闭,一直占着资源

    一、读的方法,r

    1、readable,判断是否只读

    # 文件打开模式,读r、写w,默认打开是只读模式
    f=open("锦觅","r",encoding='utf-8')
    #是否只读
    print(f.())
    f.close()
    #True
    f=open("锦觅","w",encoding='utf-8')
    #是否只读
    print(f.readable())
    f.close()
    #False

    2、readline一次读一行

    #read读取全部; readline一次读一行;end=''是去掉换行;超行时不报错
    f=open("锦觅","r",encoding='utf-8')
    #是否只读
    print('1',f.readline(),end='')
    print('2',f.readline())
    print('3',f.readline())
    print('4',f.readline())
    print('5',f.readline())
    print('6',f.readline())
    print('7',f.readline())
    f.close()
    #1 香蜜沉沉烬如霜
    # 2 哪吒
    #
    # 3 陈情令
    #
    # 4 亲爱的
    #
    # 5 热爱的
    # 6
    # 7
    f=open("锦觅","r",encoding='utf-8')
    #是否只读
    f.read()#已经读取完,光标已经在最后位置,f.readline()再读取时没有内容
    print('1',f.readline(),end='')
    f.close()
    #1

    3、readlines

    #将文件所有内容放在列表中
    f=open("锦觅","r",encoding='utf-8')
    data=f.readlines()
    print(data)
    f.close()
    #['香蜜沉沉烬如霜
    ', '哪吒
    ', '陈情令
    ', '亲爱的
    ', '热爱的']

    二、写的方法w

    1、w写,若文件存在,先清空;若不存在,先新建个新文档;
    换行
    # w写,若文件存在,先清空;若不存在,先新建个新文档
    f=open("锦觅","w",encoding="utf-8")
    f.write("《锦觅》文档中显示如下:111")
    f.write("222")
    f.write("333
    444
    ")
    f.write("555
    ")
    f.write("666")
    # 《锦觅》文档中显示如下:111222333
    # 444
    # 555
    # 666

    2、writable()#是否是可写的

    3、writelines,只能写入字符串,否则报错

    # writelines以列表形式写入
    f=open("锦觅","w",encoding="utf-8")
    data=f.writelines(["111
    ","222"])
    print(data)
    f.close()
    # 111
    # 222

    三、追加模式:a

    代码运行前文件内容如下:
    香蜜沉沉烬如霜 哪吒 陈情令
    #
    a模式写到最后 f=open("锦觅","a",encoding="utf-8") f.write("在最后")
    运行后文件内容如下:
    香蜜沉沉烬如霜 哪吒 陈情令在最后

    四、r+既能读又能写。当先读时,写在后面;当先写时,写在前面,覆盖原有文字

    # r+既能读又能写、
    #当先读时,写在后面
    代码运行前文件内容如下:
     《锦觅》中结果为
    亲爱的
    热爱的在最后在最后在最后
    f=open("锦觅","r+",encoding="utf-8") data=f.read() print(data) f.write("锦觅") 输出结果为 #亲爱的 #热爱的在最后在最后在最后
    代码运行后文件内容如下:
    亲爱的 
    热爱的在最后在最后在最后锦觅
    代码运行前文件内容如下:
    亲爱的 
    热爱的在最后在最后在最后锦觅
    #当先写时,写在前面,覆盖原有文字
    f=open("锦觅","r+",encoding="utf-8") f.write("杨紫")
    代码运行后文件内容如下:
    杨紫的
    热爱的在最后在最后在最后锦觅

     五、文件修改

    # 将文件内容从一个文档搬到另一个文档,将“锦觅”中内容搬到“锦觅_new”
    src_f=open("锦觅",'r',encoding="utf-8")
    data=src_f.read()
    src_f.close()
    
    dst_f=open("锦觅_new",'w',encoding="utf-8")
    dst_f.write(data)
    dst_f.close()
    修改前锦觅中内容:
    香蜜沉沉烬如霜
    哪吒
    陈情令
    
    #只保存第一行
    
    src_f=open("锦觅",'r',encoding="utf-8")
    data=src_f.readlines()
    src_f.close()
    
    dst_f=open("锦觅",'w',encoding="utf-8")
    # dst_f.writelines(data)
    dst_f.write(data[0])
    dst_f.close()
    
    修改后内容
    香蜜沉沉烬如霜

     六、with关键字,不用手动close文件

    with open ("锦觅","w",encoding="utf-8") as f:
        f.write("陈情令
    ")
    
    运行后,锦觅文件结果
    陈情令
    # with打开两个文件
    with open("锦觅","r",encoding="utf-8") as src_f,
            open("锦觅_new","w",encoding="utf-8") as dst_f:
        data=src_f.read()
        dst_f.write(data)
    
    运行后,锦觅文件中内容复制到锦觅_new中
    回顾:
    • map函数运行原理:将l中的可迭代对象进行for循环,得出l中每一个值交给前面的方法处理
    l=[1,2,3,4,5]
    print(list(map(str,l)))
    #['1', '2', '3', '4', '5']
    
    • reduce
    from functools import reduce
    l=[1,2,3,4,5]
    res=reduce(lambda x,y:x+y,l,3)
    print(res)
    # 18
    
    • filter
    name=["alex_sb","yangzi"]
    res=filter(lambda x:not x.endswith("sb"),name)
    print(list(res))
    #['yangzi']
    
    • 文件处理:r,w,a
    f=open("锦觅","r",encoding="utf-8")
    print(f.read())
    f.close()
    
    • 用二进制处理文件,1、由于文件中不仅仅只有文本rt(默认是文本),可能还会存在图片、视频;2、b形式可以跨平台;文件处理时是二进制,在win,linux系统均可用
    • rb以字节的方式写文件,b方式不能指定编码
    # win系统,回车
    ;linux系统
    ;b读出来的是字节
    f=open("小猴子","rb")
    data=f.read()
    print(data)
    #b'000
    111
    222
    xe4xbdxa0xe5xa5xbd'
    
    f=open("小猴子","rb")
    data=f.read()
    # 字符串------encode--------二进制
    # 二进制------decode--------字符串
    print(data.decode("utf-8"))
    # 000
    # 111
    # 222
    # 你好
    • wb,
    f=open("小猴子1",'wb')
    f.write(bytes( "1112
    ",encoding="utf-8"))
    #小猴子1文件内容
    #1112
    • ab,文件的最后一个位置输入
    f=open("小猴子1",'ab')
    f.write(bytes( "31112
    ",encoding="utf-8"))
    #小猴子1文件内容
    #1112
    #31112

    文件方法

    • closed,是否关闭
    f=open("小猴子1",'w')
    print(f.closed)
    #False
    •  encoding
    # f.encoding,文件打开的编码
    f=open("小猴子1",'w',encoding='gb2312')
    print(f.encoding)
    #gb2312
    小猴子中内容:
    111
    222
    你好
    代码运行
    f=open("小猴子","r",encoding="gbk")
    data=f.read()
    print(data)
    #111
    #222
    #浣犲ソ
    • flush,刷新
    • tell-当前光标的位置
    小猴子文件内容
    香蜜
    哪吒
    陈情令肖战
    #当前光标所在的位置,只有read(3)代表读取3个字符,其余的文件光标都是以字节为单位如seek,tell,read
    f=open("小猴子",'r',encoding='utf-8')
    print(f.tell())
    f.readline()
    print(f.tell())
    # 0
    # 7
    • seek光标移动,配合tell;seek(1)报错
    f=open("小猴子",'r',encoding='utf-8')
    f.seek(3)
    print(f.tell())
    print(f.readlines())
    # 3
    # ['蜜
    ', '哪吒
    ', '陈情令肖战']
    • read读取字符,read(1)不报错
    f=open("小猴子",'r',encoding='utf-8')
    data=f.read(4)
    print(data)
    #香蜜
    #
    •  truncate截取,在文件中截取字段
    f=open("小猴子",'r+',encoding='utf-8')
    data=f.truncate(10)
    print(data)
    # 小猴子文件中显示
    # 香蜜
    #
    • seek
    # seek,seek几个字节
    f=open("小猴子",'r',encoding='utf-8')
    print(f.tell())
    f.seek(10)
    print(f.tell())
    print(f.seek(3))
    # 0
    # 10
    # 3
    # seek(10,0)从文件开头
    f=open("小猴子",'r',encoding='utf-8')
    print(f.tell())
    f.seek(10,0)
    print(f.tell())
    print(f.seek(3,0))
    # 0
    # 10
    # 3
    # seek(10,1)相对位置报错,因为seek字节.故采用“rb”模式
    f=open("小猴子",'rb')
    print(f.tell())
    f.seek(10,1)
    print(f.tell())
    print(f.seek(3,1))
    # 0
    # 10
    # 13
    # seek(10,2)从文件尾部开始读取
    f=open("小猴子",'rb')
    print(f.tell())
    f.seek(-7,2)
    data=f.read()
    print(data)
    # 0
    # b'xa4xe8x82x96xe6x88x98'
    呼家楼文件内容:
    2019/10/29 alex 登录1
    2019/10/30 alex 登录2
    2019/10/31 alex 登录3
    2019/11/1 alex 登录4
    2019/11/2 alex 登录5失败
    # 读日志,循环文件的推荐方式
    f=open("呼家楼","rb")
    for i in f:
        offs=-10#大致估算一行多少个字节
        while True:
            f.seek(offs,2)
            data=f.readlines()
            if len(data)>1:
                print("文件的最后一行是%s"  %(data[-1].decode("utf-8")))
                break
            offs*=2
    
    # 文件的最后一行是2019/11/2 alex 登录5失败



    
    
  • 相关阅读:
    Service(服务)简单使用
    Android设计模式——抽象工厂方法模式
    Android设计模式——工厂方法模式
    算法问题——递归算法
    Android设计模式——Builder(建造者)模式
    Android设计模式——单例模式
    蓝牙4.0权限问题
    Android 网络状态变化的监听
    RecyclerView的使用
    函数参数的引用传递与值传递
  • 原文地址:https://www.cnblogs.com/ppll/p/11723490.html
Copyright © 2011-2022 走看看