文件
1. 文件和文件对象
1.1 基础知识
文件是存储在某种长期储存介质的数据流。这些数据被操作系统管理,并且被操作系统会组织成文件系统。文件都带有名字并放在特定的文件夹或目录中。Python需要与文件建立连接,才能对文件进行操作。Python使用内置的open()函数打开文件,返回一个可以处理的文件对象(file object),这样就可以通过调用返回文件对象的方法来读写相关外部文件。
Python中共有三种类别的文件对象: 原始二进制文件, 缓冲二进制文件 以及 文本文件。它们的接口定义均在 io 模块中。注意:Python不依赖于底层操作系统的文本文件概念;所有处理都由Python本身完成,因此与平台无关。 Python处理的文件类型由open()函数的第二个参数决定。
- 二进制文件和文本文件
二进制文件就是第二个参数 (模式字符串) 包含一个'b'
打开的文件。文本文件实际是访问一个面向字节的数据流并自动处理 text encoding。文本文件的例子包括以文本模式('r'
或 'w'
)打开的文件。二进制文件把内容表示为一个特殊的Bytes字符串类型,并且允许程序不修改地访问文件内容;文本文件把内容表示为常规的str字符串,自动执行Unicode编码和解码,并且默认执行末行转换。
1.2 文件的基本操作
1.2.1 open()函数详解
open()函数: 打开文件,返回一个文件对象,如果文件不能够打开,会返回OsError.
open( file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) |
mode 是模式字符串,指定打开文件的模式。默认值是'r'
,这意味着它以文本模式打开并读取。常见的模式字符串如下:
模式字符串 | 意义 |
---|---|
r | 读取模式(默认) |
w | 写入模式,并先截断文件(文件内容清空) |
a | 写入模式,如果文件存在,则在末尾追加内容 |
x | 排他性创建模式,如果文件存在则失败 |
b | 二进制模式 |
t | 文本模式(默认) |
+ | 更新磁盘文件(读取并写入) |
在文本模式,如果 encoding 没有指定,则根据平台来决定使用的编码,查看当前平台使用的编码可以使用locale.getpreferredencoding(False):
>>> import locale
>>> locale.getpreferredencoding(False)
'UTF-8'
像之前提到的二进制文件和文本文件,以二进制模式打开的文件返回的内容为 bytes对象,不进行任何解码。在文本模式下,文件内容返回为 str ,首先使用指定的 encoding 或者使用平台默认的的字节编码解码。
buffering是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),也就是调用写入方法时立即传给外部文件;传递1选择行缓冲(仅在文本模式下可用),并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。buffering 的默认工作方式为:
1).二进制文件以固定大小的块进行缓冲,缓冲区的长度通常为4096或8192字节。
2). “交互式”文本文件使用行缓冲,其他文本文件使用固定块缓冲。
encoding 是用于解码或编码文件的编码的名称,仅适用于文本模式。默认编码为平台的编码,也支持其他的编码方法。参见Python codecs模块.
errors 可选字符串参数,指定如何处理编码和解码错误 (同样针对文本模式)。 这里不详细展开,可参见codecs错误处理方案
newline 控制通用换行模式如何生效(仅适用于文本模式)。它可以是 None
,' '
,' \n'
,'\r'
和 '\r\n'
。
- 输入时:如果newline = None,则采用通用换行模式。输入中的行可以以
'\n'
,'\r'
或'\r\n'
结尾,这些行都被翻译成'\n'
。如果newline = ’ ', 同样采用通用换行模式,但是行结尾将返回未翻译的字符给调用者。如果newline为任何其他的合法值,则输入行仅由给定字符串终止。 - 输出时:如果 newline = None,则写入的任何换行字符都将转换为各个系统默认的行分隔符 os.linesep 。 如果newline =
' '
或者' \n'
,则不进行翻译。如果 newline 是其他的合法值,则写入的任何换行字符将被转换为给定的字符串。
closefd :如果file为文件名,closefd 必须为True(默认值),否则会引发错误;如果file为文件描述符,设置closefd = False
可以使得底层文件描述符在文件关闭时仍然保持打开。
opener : 可以通过传递可调用的opener 来自定义开启器。通过使用参数调用opener获得文件对象的文件描述符。
1.2.2 文件的常见运算
读入名为 data 的文件并返回一个Python文件对象给,文件对象名为 input :
input = open('data','r') #
将文件对象 input 读入进一个单一字符串:
aString = input.read()
将文件对象 input 开始N个字节之后的数据读入进一个单一字符串:
aString = input.read(N)
读取文件对象input的下一行到一个字符串:
aString = input.readline()
读取整个文件对象到字符串列表:
aList = input.readlines()