python内置open函数详解

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

1 open函数参数介绍

open函数的参数

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

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

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

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,否则会报错。

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

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

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

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

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

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值