open()函数返回一个文件对象;如果文件不能被打开,将引发OSError;python区分二进制和文本I/O;以二进制模式打开的文件(包括mode参数中的b)返回内容为bytes对象,不能进行任何解码;在文本模式(默认 或 mode包含t)时,文件内容返回str,首先使用指定encoding或默认的字节编码解码;

在文本模式读取文件时,默认把平台特定的行结束符(Unix为\n、windows为\r\n)转换为\n;在文本模式写入数据时,默认把\n转换为平台特定结束符。这种操作修改文本文件时没有问题,但会破坏jpegexe等二进制文件中的数据;所以在读取此类文件,一定要使用二进制模式;

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()

刷新流的写入缓冲区,即将缓冲区数据写入文件,同时清空缓冲区,不需要被动等待输出缓冲区写入。对只读和非阻塞流不起作用