python 3 之文件操作

文件操作
1.文件处理的流程 
1)打开文件,得到文件句柄并赋值给一个变量
2)通过句柄对文件进行操作
3)关闭文件
        能调用方法的一定是对象
        li=[1,2,3]
        li.append('2')
        'asc'.capitalize()
    例如:
        f = open('chenli.txt') #打开文件
        first_line = f.readline()
        print('first line:',first_line) #读一行
        data = f.read()# 读取剩下的所有内容,文件大时不要用
        print(data) #打印读取内容
        f.close() #关闭文件

2.文件操作基本用法
    1)基本用法:
        file_object = open(file_name, access_mode = ‘r’, buffering = -1)
        open函数有很多的参数,常用的是file_name,mode和encoding
        file_name:打开的文件名,若非当前路径,需指出具体路径
        access_mode文件打开模式
        buffering的可取值有0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小; 
        encoding表示的是返回的数据采用何种编码,一般采用utf8或者gbk;
    2)文件打开模式
        r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
        w,只写模式【不可读;不存在则创建;存在则清空内容】
        x, 只写模式【不可读;不存在则创建,存在则报错】
        a, 追加模式【可读;   不存在则创建;存在则只追加内容】,文件指针自动移到文件尾。
        "+" 表示可以同时读写某个文件
        r+, 读写【可读,可写】
        w+,写读【可读,可写】,消除文件内容,然后以读写方式打开文件。
        x+ ,写读【可读,可写】
        a+, 写读【可读,可写】,以读写方式打开文件,并把文件指针移到文件尾。
         "b"表示以字节的方式操作,以二进制模式打开文件,而不是以文本模式。
         
        rb  或 r+b
        wb 或 w+b
        xb 或 w+b
        ab 或 a+b
         注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
        import time
        三种基本的操作模式 r(只可读) w(只可写) a(追加)
        流程:1 创建文件对象'小重山2' 2 调用文件方法进行操作  3 关闭文件

        data=open('小重山2','r',encoding='utf8').read()
        print(data)
             'r'表示读模式  encoding='utf8'表示转换字符 read()读操作 ()内是几就读取几个字符,不添加内容就是默认读取全部内容
                f=open('小重山2','r',encoding='utf8')
                data=f.read(5)
                print(data)
            补充:
                python中有三个方法来处理文件内容的读取:
                read() #一次读取全部的文件内容。

                readline() #每次读取文件的一行。

                readlines() #读取文件的所有行,返回一个字符串列表。
                print(f.readable())    #判断文件是否是r模式打开的

                print(f.closed)    #判断文件是否是关闭状态

                python中在文本文件内容移动的操作
                file.seek(offset,whence=0)     #从文件中给移动指针,从whence(0起始,1当前,2末尾)偏移offset个字节,正往结束方向移动,负往开始方向移动
                file.tell()          #返回当前文件中的位置。获得文件指针位置

                file.truncate(size=file.tell())    #截取文件到最大size个字节,默认为当前文件位置
        上述操作等于
        data=open('小重山2','r',encoding='utf8')
        f=data.read()
        print(f)4

        f=open('小重山2','r',encoding='utf8')
        f.write()#报错
        f.close()
            读写模式必须一致,如下
        f=open('小重山2','w',encoding='utf8')
        f.write('hello world')
        f.close()
            补充:
                以w方式写入文件
                    f=open('a.txt','w',encoding='utf-8')
                    # f=open('b.txt','r',encoding='utf-8') #以读的方式打开文件,文件不存在则报错
                    f=open('b.txt','w',encoding='utf-8')
                    # print(f.writable())

                    f.write('111111\n22222222')
                    f.seek(0)
                    f.write('\n333333\n444444')

                    f.writelines(['\n55555\n','6666\n','77777\n'])
                    f.close()

                    a.txt 为空
                    b.txt
                    333333
                    444444
                    55555
                    6666
                    77777
                     
                    file.write(str)     #向文件中写入字符串(文本或二进制)
                    file.writelines(seq)    #写入多行,向文件中写入一个字符串列表,注意,要自己加入每行的换行符
                    file.flush()    #刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入.
             注:当打开的对象不存在时,会自动创建对象,存在时会先将对象格式化在写内容
                    在第二遍执行写操作时将不会再次格式化 而是直接紧跟在后面接着打印 若想换行或者空格 操作如下
                       f.write('hello world \n')
               若想对对象添加内容且不格式化原有内容可执行操作如下
                     f=open('小重山2','a',encoding='utf8')  #'a'表示append追加之意
                     f.write('\nhello world \n')
                     f.write('hel')
                     f.close()  注意:if not close,数据会缓存,而不是磁盘!
            在对一个对象执行操作时 两个程序可同时对同一个文件执行操作,但 注意:程序程序结尾必须添加close 因为不知道程序什么时候帮你执行结束,程序结束才会将数据提交到磁盘
                f=open('小重山2','r',encoding='utf8')
                f.write('\nhello world \n')
                f.write('alex')
                #注意:if not close,数据会缓存,而不是磁盘!
                time.sleep(30) #让程序执行30S
                f.close()
        若对文件中间进行插入可执行如下
            data=open('小重山2','r',encoding='utf8')
            number = 0
            for i in data:
                number += 1
                if number == 6:
                    i = ''.join([i.strip(), 'iiiii'])  # 取代万恶的+
                print(i.strip())
            f.close()
                或者:
            data=open('小重山2','r',encoding='utf8')
            number = 0
            for i in data:
                number += 1
                if number == 6:
                    print(i.strip(),'qqq')
                eslse
                    print(i.strip())
            f.close()
                但现实中不这样实现,因为如果文件过大不能将文件 放置内存处理
            ##########对于大数据文件,要用以下方式(the best way):
            # number=0
            # for i in f:#这是for内部将f对象做成一个迭代器,用一行去一行。
            #     number+=1
            #     if number == 6:
            #         i = ''.join([i.strip(), 'iiiii'])  # 取代万恶的+
            #     #     print(i.strip())
            #     print(i.strip())    
        tell命令:与seek命令
            # print(f.tell())#  取出光标位置,
            # print(f.read(2))
            # print(f.tell()) #其中read中如果有中文则一个中文会被识别为三个光标位
            #
            # f.seek(0)#  移动光标到指定的位置
            # print(f.read(4))
        flush命令:
            #flush():同步吧将数据从缓存转移到磁盘上去
            ##进度条实例
            # import sys,time
            # for i in range(30):
            #     sys.stdout.write("*")
            #     sys.stdout.flush()
            #     time.sleep(0.1)间隔0.1S输出一个程序结果
           或者:
            #print的flush
            # import sys,time
            # for i in range(30):
            #     print('*',end='',flush=True)  #将flush作为一个参数使用
            #     time.sleep(0.1)
上下文管理with语句
    当你做文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
    正常情况下,代码如下:
    file = open("/tmp/foo.txt")
    data = file.read()
    file.close()
    这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。
    然而with可以很好的处理上下文环境产生的异常。下面是with版本的代码:
    with open("/tmp /foo.txt") as file:
        data = file.read()
    with的基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
     
    #with 同时管理多个文件对象
    # with open('log1','r') as f_read, open('log2','w') as f_write:
    #     for line in f_read:
    #         f_write.write(line)
     
        补充:
        模拟   tail -f access.log

        #!/usr/bin/env python
        # -*- coding:utf-8 -*-

        # tail -f access.log
        import time
        with open('access.log','r',encoding='utf-8') as f:
            f.seek(0,2)
            while True:
                line=f.readline().strip()
                if line:
                    print('新增一行日志',line)
                time.sleep(0.5)
 

猜你喜欢

转载自blog.csdn.net/qq_41675254/article/details/82941464