open函数

open()函数,该函数用于打开指定文件。该函数的语法格式如下:

open(file_name[,access_mode][,buffering])


文件类型

模式

意义

r

只读模式

w

写模式

a

追加模式

+

读写(更新)模式,可于其他模式结婚使用,比如r+代表读写模式,w+也代表读写模式

b

二进制模式,可与其他模式结合使用。比如rb代表二进制只读模式,rb+代表二进制读写模式,ab代表二进制追加模式

读写的模式图

python open函数newline python open函数_python


w只是代表写模式,而w+则代表读写模式,但实际它们的差别并不大

r或r+模式打开文件,要求文件本身是存在的。r或r+模式都不能创建文件

使用w、w+、a、a+模式打开文件,则该五年级可以是不存在的,open()函数会自动创建新文件。

#w模式准备写文件,清空文件内容
open("data","w")
#w+模式:读写模式,清空文件内容
open("data","w+")
#r+模式:读写模式
#r、r+模式都要求打开的文件存在,否则程序报错
open("data","r")
#a模式:追加模式
#w、w+、a、a+都不要求打开的文件存在,如果文件不存在,自动创建新文件
open("info",'a+')
open("info2","w")

二进制方式
b模式可被追加到其他模式上,用于代表以二进制的方式来读写文件内容。
如果没有指定b模式,以字符未单元读写文件,如果指定了b模式,以字节为单元来读写文件。
缓冲
在使用open()函数时,如果第三个参数时0(或False),那么该函数打开的文件就是不带缓重的;
如果其第三个参数是1(或True),则该函数打开的文件就是带缓冲的,此时程序I/O具有更好的性能。
按字节读取
以b模式打开文件,那么文件被当成二进制流处理,每次读取一个字节。
调用read(n)方法即可读取n个字节,如果不指定n,默认读取全部文件内容。

#rb代表以二进制形式来读取文件内容
#一般来说,rb模式读取文件,可用于处理任意文件内容,比如图片、音乐、视频等格式
f = open("我的诗歌","rb", True)

#由于目标文件以GBK字符集保存,这种字符集下,每个字符占2个字节
data = f.read(8)

print(str(data,'GBK'))

#关闭文件流
f.close()

检查异常

try:
    f = open("我的诗歌","rb", True)
    
    #由于目标文件以GBK字符集保存,这种字符集下,每个字符占2个字节
    data = f.read(8)
    #捕捉所有的OSError异常,异常对象叫e
    print(str(data,'GBK'))
except OSError as e:
    print(e)
#finally块代表无论异常,还是正常,总会执行的代码块
#由于它总会执行,因此finally块通常用于关闭资源
finally:
    #当f变量存在时,关闭f文件流 
    if "f" in globals():
        #关闭文件流
        f.close()

按字节

try:
    f = open("我的诗歌","rb", True)
    #二进制模式读取时,read方法返回值就是字节串
    #由于目标文件以GBK字符集保存,这种字符集下,每个字符占2个字节
    data = f.read(8)
    #捕捉所有的OSError异常,异常对象叫e
    print(str(data,'GBK'))
except OSError as e:
    print(e)
    print(e.args)  #打印错误参数
    print(e.errno)  #打印编号
    print(e.strerror)#打印异常描述信息
#finally块代表无论异常,还是正常,总会执行的代码块
#由于它总会执行,因此finally块通常用于关闭资源
finally:
    #当f变量存在时,关闭f文件流
    if "f" in globals():
        #关闭文件流
        f.close()

按字符读

try:
    f = open("我的诗歌","r", True, encoding='UTF-8')  #"GBK"=encoding='UTF-8'
   #按字符读取,默认读取的就是字符串
  #  data = f.read(8)
    data = f.read()
    print(data)
    #捕捉所有的OSError异常,异常对象叫e
except OSError as e:
    print(e)
    print(e.args)  #打印错误参数
    print(e.errno)  #打印编号
    print(e.strerror)#打印异常描述信息
#finally块代表无论异常,还是正常,总会执行的代码块
#由于它总会执行,因此finally块通常用于关闭资源
finally:
    #当f变量存在时,关闭f文件流
    if "f" in globals():
        #关闭文件流
        f.close()

按行读取
如果文件内容时文本,则可按行读取
文件对象方法:
readline([n]):读取一行内容。如果指定了参数n,则只读取此行内的n个字符。
readlines():读取文件内所有行。
采用循环依次读取多行

try:
    f = open('52.py','r',True,'UTF-8')
    #采用循环依次读取多行
    while True:
        line = f.readline()
        #如果没有读取一行,说明文件已经读完了
        if not  line:
            break #跳出循环
        print(line,end='')
#如果不需要处理具体的异常对象,只要except就够了
except:
    #这种方式就无法访问异常对象
    print("出现异常")
finally:
    if 'f' in globals():
        f.close()

另一种方式:直接读取所有行

try:
    f = open('52.py','r',True,'UTF-8')
    #直接读取所有行,返回所有行组成的列表
    lines = f.readlines()
    print(lines)
#如果不需要处理具体的异常对象,只要except就够了
except:
    #这种方式就无法访问异常对象
    print("出现异常")
finally:
    if 'f' in globals():
        f.close()

for-in循环迭代

try:
    f = open('52.py','r',True,'UTF-8')
    #文件对象本身就是可迭代的,因此直接用for-in循环迭代即可
    for line in f:
        print(line,end='')
#如果不需要处理具体的异常对象,只要except就够了
except:
    #这种方式就无法访问异常对象
    print("出现异常")
finally:
    if 'f' in globals():
        f.close()

文件迭代器
文件对象本身就是可遍历的(就像一个序列一样),因此,程序完全可以使用for-in循环来遍历文件内容。
程序也可以使用list()函数将文件转换成list列表,就对象文件对象的read line是()方法的返回值一样。
使用linecache随机读取行
使用lincache模块可以读取其他文件,只要该文件使用UTF-8字符集存储

import linecache
try:
    #通过linecache随机读取指定行时,甚至不需要你处理打开文件
    #linecache主要读取Python源文件,因此他要求文件内容时UTF-8字符集
   # print(linecache.getline('我的诗歌',2))
    print(linecache.getline('52.3.py', 3))
    #任何模块,访问它的__file__属性,该属性将返回该模块的源文件的完整路径
    print(linecache.getline(linecache.__file__, 3))
    #读取linecahce的所有文件内容
    print(linecache.getlines(linecache.__file__))
    #另一种方式
    for line in linecache.getlines(linecache.__file__):
        print(line,end='')
except:
    #这种方式就无法访问异常对象
    print('出现异常')