c97706524f194e328b6174121be6a1d5.png

在Python中,open() 函数可以说是最常用的函数之一了,被用来读写文件。文件可以是文本文件和二进制文件,open函数打开文件并返回一个文件对象,主要提供了一些常用的读写方法,如read(),readline(),readlines(),write(),writelines(),seek()等,当操作结束后使用close()方法关闭文件对象,释放资源。

1 open函数参数介绍

f3fd74475b3c486eaf06f51e884677ad.png

open函数的参数

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

1)file:传入不带路径的字符串(文本文件/二进制文件)或者带有绝对路径或者相对路径的文件。如果传入的文件不存在,默认会创建文件。

如果传入的文件不合要求,会报错如下:

b5cfe78b69074a47b1c14ca7b948d323.png

2)mode:指明文件打开模式的可选字符串。默认为‘r’表示以文本模式读取。

字符

含意

'r'

只读取(默认);文件必须存在,否则会报错。

'w'

只写入,是覆盖式写入(比如第一次写入后,再次打开以w方式写入会覆盖原内容。)

'x'

排它性创建,如果文件已存在则失败。如果文件不存在则创建,模式为写入,与'w'类似。

'a'

只写入,再次打开文件并不会覆盖,而是在末尾追加写入。

'b'

表示二进制模式读取和写入,,不能单独使用,须与'r','w','a','x'配合使用。

't'

文本模式(默认),与'r','w','a','x'配合使用。

比如'r'与'rt'同义,一般直接使用'r'。

'+'

打开用于更新(读取与写入),不能单独使用,须与'r','w','a','x'配合使用。

以上模式结合使用:

a. 只读取:'r',’rb’

b. 只写入:'w',’wb’,’a’,’ab’,'x','xb'

c. 读取和写入:'r+',’r+b’,'w+',’w+b’,’a+’,’a+b’,’x+’,’x+b’

  • 'r+':以读写模式打开文件,文件指针会放在文件的开头。
  • 'w+':以读写模式打开文件,原文件内容会被删除。(慎用)
  • 'a+':以读写模式打开文件用于追加,文件指针会放在文件的末尾(表现为以a+模式打开文件直接读取内容,读取的内容为空)。
  • 在读取和写入模式下我们可以使用seek()方法来移动文件指针到指定位置,以便在文件的任意位置进行读写操作。

    3)buffering:参数可选,表示设置缓冲策略,默认为None。0表示无缓冲(仅适用于二进制模式),大于0表示缓冲区的大小(以字节为单位)。

    4)encoding:参数可选,默认为系统默认编码(在Python 3中通常是UTF-8);在文本模式下可以指定编码,在二进制模式下不需要指定编码。

    5)errors:参数可选,指定编码和解码错误的处理方式。默认为None,跟值'strict'效果一样,表示严格处理错误,其他值如'ignore'用于忽略错误、'replace'替换一些错误标记等。

    5)newline:参数可选,用于控制文件读取和写入时行的结束符。默认为None,表示使用系统默认的行结束符,比如'\r\n','\n'。在文本模式下读取文件时,默认把平台特定的行结束符(Unix 上为 \n, Windows 上为 \r\n)转换为 \n。在文本模式下写入数据时,默认把 \n 转换回平台特定结束符。

    6)closefd:参数可选,closefd默认为True表示当文件对象被关闭时,同时关闭文件描述符,防止资源泄漏。当closefd为False指当文件对象被关闭时,不关闭文件描述符。当file参数传入的是文本文件时,该参数必须为Ture,否则会报错。2479d8eda08e4fc49d8e74c38ef3140e.png

    2 常用方法介绍

    1)读取方法

  • read(size=-1):从文件中读取并返回指定数量的字符或者字节,如果不指定size则读取并返回文件的全部内容。每次读取后文件指针会移动到所读内容的最后位置。
  • readline(size=-1):从文件中读取并返回一行(直到换行符 \n),或返回指定数量的字节。
  • readlines(hint=-1):读取所有行并返回列表,其中每一行都是一个字符串。如果指定了 hint,则读取指定数量的字符或者字节。
  • 2)写入方法

  • write(str):将字符串或字节写入文件,只写入一行,并且不会在末尾添加换行符,需要自己添加。
  • writelines(lines):向文件写入一个字符串或者字节列表,可写入多行,并且不会在末尾添加换行符,需要自己添加。
  • 3)移动文件对象指针位置

  • seek(offset, whence=0):移动文件读取指针到指定位置。offset 是指从 whence 指定的位置开始计算的字符或者字节数。whence 的值为 0(文件开头,默认值)、1(当前位置)或 2(文件末尾)。
  • tell():返回文件当前的指针位置。
  • 4)关闭文件对象

    close():关闭文件对象。

    5)其他方法

    flush():将缓冲区的内容写入文件,但不关闭文件。

    fileno():返回文件的描述符(一个小的非负整数)。

    isatty():如果文件是一个与终端设备(tty)相关联的,则返回 True,否则返回 False.

    readable()writable()seekable():分别用于检查文件是否可读、可写、以及是否支持 seek() 操作。

    truncate(size=None):截断文件到指定大小。如果 size 未指定,则截断文件到当前位置。如果当前位置大于文件大小,则文件将被扩展,并且扩展部分的内容将用零字节填充。

    3 常用属性介绍

  • name 属性:返回打开文件的名称。
  • closed 属性:返回一个布尔值,指示文件是否已关闭。当文件被成功打开时,closed 属性为 False。一旦文件被关闭,closed属性为True。
  • mode属性:返回open函数传入的mode值。
  • encoding属性:返回open函数使用的编码。
  • buffer属性:返回open函数的buffer配置。
  • errors属性:返回open函数的errors配置。
  • 4 示例介绍

    1)打开空文本文件,并追加写入,然后读取文件内容。

    mode传入‘a’追加写入:

    fs = open('config1.txt','w')
    fs.write('hello python!\n')
    fs.write('hello world!\n')
    print(f'文件是否关闭:{fs.closed}')
    fs.close()
    print(f'文件是否关闭:{fs.closed}')

    结果:

    文件是否关闭:False
    文件是否关闭:True

    mode传入‘r’,只读文件:

    fs = open('config1.txt','r')
    print(f"read() 读取结果:{fs.read()}")
    fs.close()

    结果:read()函数读取为字符串。

    read() 读取结果:hello python!
    hello world!

    2)打开空二进制文件,覆盖写入,然后读取内容。

    mode分别传入‘wb’和‘rb’

    fs = open('config1.txt','wb')
    fs.writelines([b'hello python!\n',b'hello world!\n'])
    fs = open('config1.txt','rb')
    print(f"readlines() 读取结果:{fs.readlines()}")
    fs.close()

    结果:

    readlines() 读取结果:[b'hello python!\n', b'hello world!\n']

    3)打开存在的文件内容,可进行读写操作,并使用seek移动文件指针位置。

    mode传入‘a+’,使用上面写入的文件。

    fs = open('config1.txt','a+')
    #‘a+’模式 文件打开后,指针会移动到末尾。我们先打印看下
    print(f"打开后文件指针位置 :{fs.tell()}")
    #移动到从开头算第3个位置,
    fs.seek(2)
    print(f"移动后 文件指针位置 :{fs.tell()}")
    print(f'readline() 从指针位置开始读取第一行内容为:{fs.readline()}')
    #然后在末尾插入一个字符‘e’
    fs.write('e')
    #因为位置已经移到末尾 所以以下打印内容为空
    print(f"readlines() 读取结果:{fs.readlines()}")
    fs.seek(0)
    #重新移动指针位置到第0个字符,然后打印
    print(f"readlines() 重新移动后读取结果:{fs.readlines()}")
    fs.close()

    结果:

    打开后文件指针位置 :26
    移动后 文件指针位置 :2
    readline() 从指针位置开始读取第一行内容为:llo python!
    readlines() 读取结果:[]
    readlines() 重新移动后读取结果:['hello python!\n', 'hello world!e']

    5 使用with….as上下文管理器,不需要每次执行close函数

    举例:使用with…….as语句打开文件,当操作结束后,会自动close文件对象。

    with open('/Users/htsc/Desktop/config1.txt','r+') as fs:
       print(f'readline() 从指针位置开始读取第一行内容为:{fs.readline()}')
    print(f'fs.closed :{fs.closed}')

    #结果:

    readline() 从指针位置开始读取第一行内容为:hello python!
    fs.closed :True

    共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

    —–指水滴不断地滴,可以滴穿石头;

    —–比喻坚持不懈,集细微的力量也能成就难能的功劳。

    —-感谢读者的阅读和学习和关注,谢谢大家。

    作者:科雷learning

    物联沃分享整理
    物联沃-IOTWORD物联网 » python内置open函数详解

    发表回复