按文件中数据的组织形式把文件分为文本文件和二进制文件两类。
文本文件:文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符'\n'结尾。常规字符串是指记事本或其他文本编辑器能正常显示、编辑并且人类能够直接阅读和理解的字符串,如英文字母、汉字、数字字符串。文本文件可以使用字处理软件如gedit、记事本进行编辑。
二进制文件:二进制文件把对象内容以字节串(bytes)进行存储,无法用记事本或其他普通字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、显示、修改或执行。常见的如图形图像文件、音视频文件、可执行文件、资源文件、各种数据库文件、各类office文档等都属于二进制文件
文件内容操作三步走:打开、读写、关闭。
- open(file, mode='r', buffering=-1, encoding=None, errors=None,
- newline=None, closefd=True, opener=None)
- file参数指定了被打开的文件名称。
- mode参数指定了打开文件后的处理方式。
- buffering参数指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。默认值-1表示由系统管理缓存。
- encoding参数指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如GBK、utf8、CP936等等。
如果执行正常,open()函数返回1个文件对象,通过该文件对象可以对文件进行读写操作。
如果指定文件不存在、访问权限不够、磁盘空间不足或其他原因导致创建文件对象失败则抛出异常。
- f1 = open('file1.txt', 'r') # 以读模式打开文件
- f2 = open('file2.txt', 'w') # 以写模式打开文件
当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何修改都确实被保存到文件中。
f1.close()
但是,即使写了关闭文件的代码,也无法保证文件一定能够正常关闭。例如,如果在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这时文件就无法正常关闭。在管理文件对象时推荐使用with关键字,可以有效地避免这个问题。
- with open(filename, mode, encoding) as fp:
- #这里写通过文件对象fp读写文件内容的语句
上下文管理语句with还支持下面的用法:
- with open('test.txt', 'r') as src, open('test_new.txt', 'w') as dst:
- dst.write(src.read())
文件打开方式:
| 模式 | 说明 |
| r | 读模式(默认模式,可省略),如果文件不存在则抛出异常 |
| w | 写模式,如果文件已存在,先清空原有内容 |
| x | 写模式,创建新文件,如果文件已存在则抛出异常 |
| a | 追加模式,不覆盖文件中原有内容 |
| b | 二进制模式(可与其他模式组合使用) |
| t | 文本模式(默认模式,可省略) |
| + | 读、写模式(可与其他模式组合使用) |
文件对象常用属性
| 属性 | 说明 |
| buffer | 返回当前文件的缓冲区对象 |
| closed | 判断文件是否关闭,若文件已关闭则返回True |
| fileno | 文件号,一般不需要太关心这个数字 |
| mode | 返回文件的打开模式 |
| name | 返回文件的名称 |
- 例7-1 向文本文件中写入内容,然后再读出。
-
- s = 'Hello world\n文本文件的读取方法\n文本文件的写入方法\n'
-
- with open('sample.txt', 'w') as fp: #默认使用cp936编码
- fp.write(s)
-
- with open('sample.txt') as fp: #默认使用cp936编码
- print(fp.read())
- 例7-3 读取并显示文本文件所有行。
-
- with open('sample.txt') as fp: #假设文件采用CP936编码
- for line in fp: #文件对象可以直接迭代
- print(line)