【我的python学习之旅】python输入和输出之文件和文件对象及其方法 (二十八)

文件和文件对象及其方法

文章目录

  • 文件和文件对象及其方法
    • 文件对象和open()函数
    • 文件的打开 、写入、读取和关闭
    • with 语句和上下文管理协议
    • 文件对象的方法

文件可以看作是数据的集合,一般保存在磁盘或其他存储介质上。

文件对象和open()函数

内置函数open()用于打开或创建文件对象,其语法格式如下。
f = open(file, mode=’ r ', buffering= - 1, encoding= None)

open() 返回一个 file object,最常用的有两个参数: open(filename, mode)。

>>> f = open('workfile', 'w')

其中,file是要打开或创建的文件名,如果文件不在当前路径,需指出具体路径; mode是打开文件的模式; buffering表示是否使用缓存(默认为-1,表示使用系统默认的缓冲区大小); encoding是文件的编码。open()函数返回一个文件对象f。

在使用open(函数时可以指定打开文件的模式为’r’(只读)、‘w’(写人,写人前删除旧内容)、‘x’(创建新文件,如果文件存在,则导致FileExistsError)、‘a’(追加)、‘b’(二进制文件)、‘t’(文本文件,默认值)、‘+’(更新,读写)。

open()函数默认打开模式为’t’,即文本读取模式。

文件操作容易产生异常,而且最后需要关闭打开的文件故一般使用try … except… finally语句,在try语句块中执行文件的相关操作,使用except捕获可能发生的异常,在finally语句块中确保关闭打开的文件。

try:
f = open(file, mode)      #打开文件
    #操作打开的文件
except:                  #捕获异常
    #发生异常时执行的操作
finally:
    f. close()            #关闭打开的文件

文件的打开 、写入、读取和关闭

通过内置函数open()可以创建或打开文件对象:通过文件对象的实例方法write/writelines 可以写人字符串到文本文件:通过文件对象的实例方法read/ readline可以读取文
本文件的内容;文件读写完成后,应该使用close方法关闭文件。
文本文件对象是可迭代对象,也可以使用for循环语句遍历所有的行。

例读取并输 出文本文件。

import sys
filename = sys.argv[0]   #所读取并输出的就是本程序文件type_file.py
f=open(filename, 'r', encoding='utf8')    #打开文件
line_no=0            #统计行号
while True:
    line_no += 1      #行号计数
    line = f.readline()  #读取行信息
    if line:  
        print(line_no, ":", line)  #输出行号和该行内容
    else:  
        break
f.close()             #关闭打开的文件

with 语句和上下文管理协议

使用 try… except … finally 语句可以确保在try语句块中获得的资源(例如打开的文件)在finally语句块中释放。
为了简化操作,Python语言中与资源相关的对象可以实现上下文管理协议。实现上下文管理协议的对象可以使用with语句:
with context [as var]
操作语句
with语句定义了一个上下文。在执行with语句时,首先调用上下文对象context的__enter__ (), 其返回值赋给var;离开with语句块时,最后调用context的__ exit__ (),确保 释放资源。
文件对象支持使用with语句,确保打开的文件自动关闭:
with open(file, mode) as f:
#操作打开的文件

例利用with语句读取并输出文本文件。

import sys
filename = sys.argv[0]  #所读取并输出的就是本程序文件type_file_with.py
line_no=0            #统计行号
with open(filename, 'r', encoding='utf8') as f:  #使用with语句实现上下文管理协议
    for line in f:
        line_no += 1          #行号计数
        print(line_no, ":", line)  #输出行号和该行内容
f.close()

文件对象的方法

假定已创建名为 f 的文件对象。

要读取文件内容,请调用 f.read(size),它会读取一些数据并将其作为字符串(在文本模式下)或字节串对象(在二进制模式下)返回。 size 是一个可选的数值参数。 当 size 被省略或者为负数时,将读取并返回整个文件的内容;如果文件的大小是你的机器内存的两倍就会出现问题。 当取其他值时,将读取并返回至多 size 个字符(在文本模式下)或 size 个字节(在二进制模式下)。 如果已到达文件末尾,f.read() 将返回一个空字符串 (’’)。

>>>
>>> f.read()
'This is the entire file.\n'
>>> f.read()
''

f.readline() 从文件中读取一行;换行符(\n)留在字符串的末尾,如果文件不以换行符结尾,则在文件的最后一行省略。这使得返回值明确无误;如果 f.readline() 返回一个空的字符串,则表示已经到达了文件末尾,而空行使用 ‘\n’ 表示,该字符串只包含一个换行符。:

>>>
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''

要从文件中读取行,你可以循环遍历文件对象。这是内存高效,快速的,并简化代码:

>>>
>>> for line in f:
...     print(line, end='')
...
This is the first line of the file.
Second line of the file

如果你想以列表的形式读取文件中的所有行,你也可以使用 list(f) 或 f.readlines()。

f.write(string) 会把 string 的内容写入到文件中,并返回写入的字符数。:

>>>
>>> f.write('This is a test\n')
15

在写入其他类型的对象之前,需要先把它们转化为字符串(在文本模式下)或者字节对象(在二进制模式下):

>>>
>>> value = ('the answer', 42)
>>> s = str(value)  # convert the tuple to string
>>> f.write(s)
18

f.tell() 返回一个整数,给出文件对象在文件中的当前位置,表示为二进制模式下时从文件开始的字节数,以及文本模式下的不透明数字。

要改变文件对象的位置,请使用 f.seek(offset, whence)。 通过向一个参考点添加 offset 来计算位置;参考点由 whence 参数指定。 whence 的 0 值表示从文件开头起算,1 表示使用当前文件位置,2 表示使用文件末尾作为参考点。 whence 如果省略则默认值为 0,即使用文件开头作为参考点。

>>>
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)      # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'

在文本文件(那些在模式字符串中没有 b 的打开的文件)中,只允许相对于文件开头搜索(使用 seek(0, 2) 搜索到文件末尾是个例外)并且唯一有效的 offset 值是那些能从 f.tell() 中返回的或者是零。其他 offset 值都会产生未定义的行为。

你可能感兴趣的:(python笔记)