• Python文件处理


    一、open模式

    文件是日常编程中常用的操作,通常用于存储数据或应用系统的参数

    语法:

           open(filename,mode)

    参数:

           filename:要访问的文件名

           mode:打开文件的模式

    模式

    说明

    r

    以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

    w

    打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    a

    打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    rb

    以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

    wb

    以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    ab

    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    r+

    打开一个文件用于读写。文件指针将会放在文件的开头。

    w+

    打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    a+

    打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

    rb+

    以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

    wb+

    以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    ab+

    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

     

    二、常用函数

    序号

    方法及描述

    1

    file.close()

    关闭文件。关闭后文件不能再进行读写操作。

    2

    file.flush()

    刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

    3

    file.fileno()

    返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

    4

    file.isatty()

    如果文件连接到一个终端设备返回 True,否则返回 False。

    5

    file.next()

    返回文件下一行。

    6

    file.read([size])

    从文件读取指定的字节数,如果未给定或为负则读取所有。

    7

    file.readline([size])

    读取整行,包括 " " 字符。

    8

    file.readlines([sizeint])

    读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

    9

    file.seek(offset[, whence])

    设置文件当前位置

    10

    file.tell()

    返回文件当前位置。

    11

    file.truncate([size])

    从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

    12

    file.write(str)

    将字符串写入文件,没有返回值。

    13

    file.writelines(sequence)

    向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行

    三、常用的open模式

    r:读模式,文件不存在时不会创建新文件,文件的指针将会放在文件的开头。默认模式

    f = open('test.txt','r',encoding='UTF-8')       #encoding是转码的意思,告诉解释器以UTF-8的编码格式。不指定的话默认是以操作系统的编码为准的
    print(f.read())                                 #读所有,bytes--decode(utf-8)--str
    # print(f.read(5))                              #读取5个字符串(b模式下单位是字节)
    # print(f.readlines())                          #读所有,将结果放入列表中
    # print(f.readline())                           #一次读一行
    # print(f.readline(),end='')                    #一次读一行,并指定结束符,默认结束符为
    
    f.close()                                       #关闭文件
    
    执行结果:
    第一行
    第二行
    第三行

    w:写模式,文件存在时则覆盖,文件不存在时创建新文件

    f = open('aa.txt','w',encoding='UTF-8')
    f.write('第一行 
    ')                           #换行需要添加换行符
    f.write('第二行
    ')
    # f.writelines('第三行
    ','第四行
    ')           #写入一个字符串列表,换行需要添加换行符
    
    #aa.txt中的内容:
    第一行
    第二行

    a:追加模式。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入

    f = open('aa.txt','a',encoding='UTF-8')
    f.write('追加的内容')
    # print(f.tell())                             #打印光标当前位置,单位是字节
    # f.flush()                                   #使内存的内容刷新至文件
    # f.seek(0)                                   #a模式光标会定位在文件尾部,这里重新定位一下光标位置
    # print(f.tell())                             #输出光标位置为0
    f.close()
    
    #aa.txt中的内容:
    第一行
    第二行
    追加的内容

    rb:二进制格式的读模式。文件指针将会放在文件的开头

    f = open('test.txt','rb')
    print(f.read())
    # print(f.read().decode('UTF-8'))       #可以decode,输出字符串
    f.close()
    
    #执行结果:
    b'xe7xacxacxe4xb8x80xe8xa1x8c
    xe7xacxacxe4xbax8cxe8xa1x8c
    xe7xacxacxe4xb8x89xe8xa1x8c'

    wb:二进制格式的写模式。文件存在时则覆盖,文件不存在时创建新文件

    f = open('a.txt','wb')
    f.write('你好'.encode('UTF-8'))         #字符串是Unicode编码,不能直接作为bytes类型写入,需要encode
    f.close()

    ab:二进制格式的追加模式。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入

    r+:读写模式。文件指针将会放在文件的开头。

    w+:读写模式。文件存在时则覆盖,文件不存在时创建新文件

    a+:读写模式。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写

    rb+:二进制格式的读写模式。文件指针将会放在文件的开头

    wb+:二进制格式的读写模式。文件存在时则覆盖,文件不存在时创建新文件

    ab+:二进制格式的追加模式。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写

    四、 with open语句

    如果不用with语句,代码如下:

    f = open('test.txt','r',encoding='UTF-8')
    print(f.read())
    f.close()

    这里有两个问题:一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。

    with open('test.txt','r',encoding='UTF-8') as f:
        print(f.read())

    五、File(文件) 方法

    1、file.read([size])

    从文件中读取指定的字节数,如果未给定或为负则读取所有。

    语法:

      fileObject.read();

    参数:

           size:从文件中读取的字节数

           (文件打开方式为文本模式时,代表读取n个字符;文件打开方式为b模式时,代表读取n个字节)

    返回值:

           返回从字符串中读取的字节

    实例:

    #test.txt的内容如下:
    第一行
    第二行
    第三行
    
    #读取文件内容:
    f = open('test.txt','r',encoding='UTF-8')
    #print(f.read())            #读取所有
    print(f.read(5))            #读取5个字符串
    
    #输出结果如下:
    第一行
    第

    2、file.seek(offset[, whence])

    seek() 方法用于移动文件读取指针到指定位置

    语法:

      fileObject.seek(offset[, whence])

    参数:

           offset -- 开始的偏移量,也就是代表需要移动偏移的字节数

           whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起

           (1和2必须在b模式下才能执行)

    实例1:

    f = open('test.txt','r',encoding='UTF-8')
    print(f.read())                     #读取完所有内容,此时光标在文件最后
    f.seek(3)                           #从文件开头位置往后偏移3个字节
    print(f.read())
    print(f.tell())                     #打印光标当前位置
    
    #返回的结果
    第一行
    第二行
    第三行
    一行
    第二行
    第三行
    31

    实例2:

    f = open('test.txt','rb')
    print(f.read(3).decode('UTF-8'))                    #读取三个字节,此时光标在第三个字节的位置
    print(f.tell())
    f.seek(3,1)                                         #从当前位置往后偏移3个字节
    print(f.read().decode('UTF-8'))
    
    #返回的结果
    3
    行
    第二行
    第三行

    实例3:

    f = open('test.txt','rb')
    f.seek(0,2)                                         #从文件末尾位置偏移0个字节,就是文件最后
    print(f.tell())
    f.seek(-3,2)                                        #从文件末尾位置往前偏移3个字节
    print(f.tell())
    print(f.read().decode('UTF-8'))
    
    #返回的结果
    31
    28

    3、file.truncate([size])

    truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小

    语法:

      fileObject.truncate( [ size ])

    参数:

           size -- 可选,如果存在则文件截断为 size 字节

    实例:

    f = open('test.txt','r+',encoding='UTF-8')  #读写模式
    f.truncate(6)                               #截取6个字节
    print(f.read())
    
    #返回的结果
    第一

    六、 小程序

    1、文件拷贝

    with open('test.txt','r',encoding='UTF-8') as read_f,open('test2.txt','w',encoding='UTF-8') as write_f:
        for line in  read_f:                    #循环读取test.txt文件内容
            write_f.write(line)                 #写入到test2.txt

    2、图片拷贝

    import sys
    
    source_file,target_fiel=sys.argv[1],sys.argv[2]                                     #传参赋值
    
    with open(source_file,'rb') as read_f,open(target_fiel,'wb') as write_f:            #二进制模式
        for line in  read_f:
            write_f.write(line)
    
    #用法:python copy.py source.jpg target.jpg
    #适用于任何类型文件的拷贝

    3、仿tail程序

    import sys
    import time
    
    file = sys.argv[2]
    
    with open(file,'rb') as f:                      #下面要用到seek()方法的whence,所以用b模式
        f.seek(0,2)
        while True:
            line = f.readline()
            if line:
                print(line.decode('UTF-8'))
            else:
                time.sleep(0.2)
    
    #用法:python tail.py -f xxx.log

    4、文件修改

    import os
    
    with open('test.txt','r',encoding='utf-8') as read_f,open('.test.txt.swap','w',encoding='utf-8') as write_f:
        for line in read_f:
            if line.startswith('第三行'):
                line='这是修改后的第三行'
            write_f.write(line)
    
    os.remove('test.txt')
    os.rename('.test.txt.swap','test.txt'
  • 相关阅读:
    git 无法提交到远程服务器【转载】
    vscode 常用快捷键
    mongodb nodejs一个有自增id的功能
    C++ lambda表达式与函数对象
    TypeScript的async, await, promise,多参数的调用比较(第2篇)
    了解TypeScript的async,await,promise(第1篇)
    TyepScript判断一个变量是null, or undefined
    MongoClient 对 Mongodb的 增删改查 操作
    TypeScript第一个Promise程序
    C++基类的继承和多态
  • 原文地址:https://www.cnblogs.com/yanmj/p/7155310.html
Copyright © 2020-2023  润新知