• python文件操作


    介绍:

    计算机系统分为:计算机硬件,操作系统,应用程序三部分。

    我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

    有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

    #1. 打开文件,得到文件句柄并赋值给一个变量
    #2. 通过句柄对文件进行操作
    #3. 关闭文件
    #1. 打开文件,得到文件句柄并赋值给一个变量
    f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
    
    #2. 通过句柄对文件进行操作
    data=f.read()
    
    #3. 关闭文件
    f.close()

    了解文件操作模式:

    1、读模式

    • f.read()
    • f.readable()#这个文件是否可读,返回布尔值;
    • f.readline(“读模式”)#读取第一行;f.readlines(“读模式”)#读取所有内容 以字符串方式存储在列表内;

    2、写模式

    • f.write('写模式')   #注意写之前会清空原文本文件,然后进行写入! 若没有文件则会新创建一个文件进行写入;
    • f.write("写模式1 写模式2 写模式3 写模式4 ")   #换行写入;
    • f.writelines(["写模式1 写模式2 写模式3 写模式4 "])   #该模式要传入的数据类型必须是列表;
    • f.writable()  #这个文件是否可写,返回布尔值;
    f = open('小重山','w',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码
    data = f.write('写模式')
    print(data)
    f.close()
    #注意 写之前会清空原文本文件,然后进行写入!  若没有文件则会新创建一个文件进行写入
    
    
    f = open('name','w',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码
    data = f.write("写模式1
    写模式2
    写模式3
    写模式4
    ")
    print(data)
    f.close()
    写模式1
    写模式2
    写模式3
    写模式4
    f.writelines(["写模式1
    写模式2
    写模式3
    写模式4
    "])#该模式要传入的数据类型必须是列表
    
    f = open('小重山','a',encoding='utf-8') # a 代表 append 追加 不会清空原文件
    data = f.write('写模式')
    print(data)
    f.close()
    View Code

    3、r+ , w+ , a+模式

    with:

    同时管理多个文件对象

    with open('log1','r') as f_read, open('log2','w') as f_write:
         for lien in f_read:
             f_write.write(lien)
    View Code

    操作方法总结:

    #1. 打开文件的模式有(默认为文本模式):
    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    w,只写模式【不可读;不存在则创建;存在则清空内容】
    a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】
    
    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
    rb 
    wb
    ab
    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
    
    #3. 了解部分
    "+" 表示可以同时读写某个文件
    r+, 读写【可读,可写】
    w+,写读【可读,可写】
    a+, 写读【可读,可写】
    
    
    x, 只写模式【不可读;不存在则创建,存在则报错】
    x+ ,写读【可读,可写】
    xb
    View Code
    f = open("name","rb")
    date = f.read()
    #字符串------------>>>encode----------->>>bytes
    #bytes------------>>>encode----------->>>字符串
    print(date)
    print(date.decode("utf-8"))

    4、文件修改过程实质上就是覆盖的过程

    #1、将要修改的文件从硬盘读取到内存中
    #2、在内存中修改文件
    #3、把修改后的文件覆盖到硬盘中

    #普通版
    f = open("name","r",encoding="utf-8")
    date = f.readlines()#读取所有内容 以字符串方式存储在列表内
    f.close()
    t = open("小重山","w",encoding="utf-8")
    t.write(date[1]) #通过切片的方式将列表内容取出并写到文件中
    t.close()
    #升级版
    with open("name","r",encoding="utf-8") as f,
            open("小重山","w",encoding="utf-8") as t:  #(as f)等价于(f=),斜杠回车换行
        date = f.readlines()
        f.close()
        t = open("小重山", "w", encoding="utf-8")
        t.write(date[0])
        t.close()
    View Code

     5、文件的其他操作

    • 文件内光标的移动:

        注意:read(3)代表读取3个字符,其余的文件光标移动都是以字节为单位如seek,tell,truncate

    # f = open("name","r+",encoding="utf-8",newline="")#去掉回车键的处理显示原值
    ;
    # deta = f.read(3)#以字符方式读取
    # print(f.tell())
    # f.seek(12)#以字节方式调整光标的位置,(在windows系统中(/r/n)表示回车换行)
    # print(f.tell())#以字节方式读取光标的位置
    # print(f.readlines())
    # print(f.truncate(3))#文件截取实际就是在写文件必须用(r+,a+)
    # f.flush() #把缓存里的数据更新到磁盘上(防止程序崩溃数据丢失)作用于终端

    seek的高级用法:
    seek("光标的参数",0)#正序,默认从0开始数 seek(10,0)=seek(10)
    seek("光标的参数",1) #相对位置,相对于光标上次停在的位置 seek(10,1)
    seek("光标的参数",2)#倒序,从文件的最后一个字符开始数,seek(-10,2)
    a = [1234,456,"dasfgf","we2","xdfcgbhjk","234567"]
    print(len(a)) #查看列表的长度
    print(a[-1]) #提取列表中的最后一行
    
    
    #需求:读取日志文件的最后一行。
    f = open("name","rb")#以字节的方式读取
    for i in f: #直接从文件中遍历,要一行取一行,不占内存;
        #print(i.decode("utf-8"))#解码
        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 #如果最后一行没有取完则重新定义偏移量,知道len(data)>1;
    View Code
     
    f = open('小重山','r',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码
    number = 0
    for i in f:   #这里for内部将f做成一个迭代器,用一行取一行,用完清空,不占内存
        number += 1
        if number == 2:
            i = ''.join([i.strip() , 'oooo'])
        print(i.strip())
    f.close()
    
    
    print(f.tell(3))  #打印光标的位置 对于英文字符就占一个,中文字符占3个;
    
    print(f.seek(3))  #调整光标位置的
    
    
    f.flush() #把缓存里的数据更新到磁盘上(防止程序崩溃数据丢失)
    
    
    >>> f = open('hello','w')
    >>> f.write('alex is 35 ')11
    >>> f.write('hello world')11
    >>> f.flush() 
    alex is 35 hello world
    
    #进度条效果展示
    
    import sys,time
    
    for i in range(30):  #第一种方法
        sys.stdout.write('=')
        sys.stdout.flush()
        time.sleep(0.1)
    
    
    for i in range(30):  #第二种方法
        print('=',end='',flush=True)
        time.sleep(0.1)
    f.truncate()# 截取字符
    
    f = open('小重山','a',encoding='utf-8')
    f.write('asfzxc')
    f.truncate(5)
    View Code
  • 相关阅读:
    Android 3.0 r1 API中文文档(108) —— ExpandableListAdapter
    Android 3.0 r1 API中文文档(113) ——SlidingDrawer
    Android 3.0 r1 API中文文档(105) —— ViewParent
    Android 中文 API (102)—— CursorAdapter
    Android开发者指南(4) —— Application Fundamentals
    Android开发者指南(1) —— Android Debug Bridge(adb)
    Android中文API(115)——AudioFormat
    Android中文API(116)——TableLayout
    Android开发者指南(3) —— Other Tools
    Android中文API (110) —— CursorTreeAdapter
  • 原文地址:https://www.cnblogs.com/songzhixue/p/9942069.html
Copyright © 2020-2023  润新知