open()函数返回一个文件对象;如果文件不能被打开,将引发OSError;python区分二进制和文本I/O;以二进制模式打开的文件(包括mode参数中的b)返回内容为bytes对象,不能进行任何解码;在文本模式(默认 或 mode包含t)时,文件内容返回str,首先使用指定encoding或默认的字节编码解码;
在文本模式读取文件时,默认把平台特定的行结束符(Unix为\n、windows为\r\n)转换为\n;在文本模式写入数据时,默认把\n转换为平台特定结束符。这种操作修改文本文件时没有问题,但会破坏jpeg或exe等二进制文件中的数据;所以在读取此类文件,一定要使用二进制模式;
open函数格式
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- file:文件路径
- mode:可选;文件的模式;默认为:r
- r:读取;只能对文件进行读取操作,不能写入;指定文件不存在会爆错
- w:写入;只能对文件写入,不能读取;如果指定文件不存在,则先创建再写入;如果存在,则直接打开写入;写入时会清空文件内容
- x:排它性创建;如果文件存在则创建失败;只能对其进行写入,不能读取
- a:在文件末尾追加;只能卸乳不能读取;如果指定文件存在,则直接打开写入;反之则创建后再写入;写入时追加到文件末尾;
- b:二进制模式
- t:文本模式
- +:打开文件进行更新(可读或可写)
- encoding:用于解码后编码;可选;如果没有指定,则默认与平台有关;只在文本模式下使用
- buffing:用于设置缓冲区策略;可选的整数
- 0:关闭缓冲,只允许在二进制模式下
- 1:行缓冲;旨在文本模式下可用
- > 1:表示固定大小的块缓冲区的字节大小;
- < 0:缓冲区大小为系统默认
- 如果没有给出buffering参数,默认缓冲区策略:
- 二进制文件以固定大小的块进行缓冲
- 交互式文本文件使用行缓冲;其他文本文件使用上述策略用于二进制文件
- errors:可选;指定解码或编码错误时异常处理
- newline:如何解析换行符;选项:None、''、\n、\r、\r\n
- 读取时:
- 如果为None,则启用通用换行模式。输入行以\n、\r、\r\n结尾,都会被统一翻译为\n
- 如果为'',则启用通用换行模式,输入行以\n、\r、\r\n结尾,不在统一翻译为\n,而是原样输出;
- 写入时:
- 如果为None,则写入的任何\n字符都将转换为系统默认的行分隔符
- 如果为''或\n,则不进行翻译
- 如果是任何其他合法值,则写入的任何
\n
都被转换为给定的字符串;
如:
>>> with open('test.txt', 'w', newline='') as f:
... f.write('www\r\nrrr')
...
8
>>> with open('test.txt', 'r', newline='') as f:
... f.read()
...
'www\r\nrrr'
>>>
文件的方法
读取
1. read
格式:
f.read(size=-1, /)
- size:可选;
- 省略 或 < 0时,读取并返回整个文件内容;
- > 0时:文本模式,读取并返回最多size个字符;二进制模式,读取并返回size个字节;
读取文件内容,如果为文本模式,返回字符串;如果问二进制模式,返回字符串对象;如果到达末尾,则f.read()
返回空字符串
例子:
>>> f = open('test.txt', 'r')
>>> f.read()
'www\nrrr'
>>> f.read()
''
2. readline
格式:
f.readline(size=-1, /)
从文件中读取单行数据;字符串末尾保留换行符\n
,只有文件不以换行符结尾时,文件的最后一行才会省略换行符;只要返回空字符串,则表示到达文件末尾,空行使用\n
表示;
例子:
>>> f = open('test.txt', 'r')
>>> f.readline()
'www\n'
>>> f.readline()
'rrr'
>>> f.readline()
''
3. readlines
格式:
f.readlines(hint=-1, /)
- hint:控制要读取的行数;如果(以字节/字符数表示的)所有行的总大小超出了hint则将不会读取更多的行
- 0 或 更小的hint值 以及 None,被视为没有hint,读取全部行数;
从流中读取并返回包含多行的列表;返回包含hint行的列表;如果hint未指定则返回全部行;
例子:
>>> f = open('test.txt', 'r')
>>> f.readlines()
['www\n', 'rrr']
写入
1. write
格式:
f.write(text, /)
将text的内容写入到文件,并返回写入的字符数;如果写入其他类型,需要转换为字符串(文本模式) 或 字节对象(二进制模式)
例子:
f.write('test\n')
f.write(str(['a', 'b', 'c']))
2. writelines
格式:
f.writelines(lines, /)
将行列表写入到流。不会添加换行符;如果需要,需在每一行末尾都添加行分隔符
例子:
>>> f = open('test.txt', 'a+')
>>> f.writelines(['123', 'abc', '!@#'])
>>> f.writelines(['123\n', 'abc\n', '!@#'])
结果:
123abc!@#123
abc
!@#
获取文件指针当前位置
格式:
f.tell()
返回文件指针的当前位置;二进制模式下从文件开始的字节数;文本模式下的数字;
例子:
>>> f = open('test.txt', 'r+')
>>> f.tell()
0
>>> f.write('python\n')
7
>>> f.tell()
7
移动文件指针
格式:
f.seek(offset, whence=0, /)
- offset:偏移量
- whence:起始位置;默认为0
- 0:从文件开头计算
- 1:当前文件位置
- 2:文件末尾作为参考点
将流的位置修改到给定的字节offset。offset相对于whence指定的位置进行解析
例子:
>>> f = open('test.txt', 'r+')
>>> f.read()
"python\nst\n['a', 'b', 'c']"
>>> f.tell()
25
>>> f.seek(5)
5
>>> f.read()
"n\nst\n['a', 'b', 'c']"
关闭文件
格式:
f.close()
关闭文件。关闭后文件对文件的任何操作都会引发ValueError;可以多次调用,但是,仅第一次调用才会生效;
例子:
>>> f = open('test.txt', 'r+')
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
>>> f.close()
刷新缓冲区
格式:
f.flush()
刷新流的写入缓冲区,即将缓冲区数据写入文件,同时清空缓冲区,不需要被动等待输出缓冲区写入。对只读和非阻塞流不起作用