一、定位
- 文件定位, 是指在操作文件时, 控制文件句柄(指针)的位置, 也就是控制文件的读取起点位置
1、seek(字节, [0, 1, 2])
-
Python
提供了seek(字节, [0, 1, 2])
方法, 来控制文件句柄的位置 -
首先, 先看一下文档中对
seek
方法的描述
Change stream position.
Change the stream position to the given byte offset. The offset is
interpreted relative to the position indicated by whence. Values
for whence are:
* 0 -- start of stream (the default); offset should be zero or positive
* 1 -- current stream position; offset may be negative
* 2 -- end of stream; offset is usually negative
Return the new absolute position.
复制代码
- 翻译:
改变流的位置
根据字节数改变流的偏移量, 偏移量相对于何处开始偏移, 下面是对应的值:
0: 流开始的位置(默认), 从零开始偏移
1: 当前的位置, 字节可以是负数
2: 流结尾的位置, 字节通常是负数
返回一个新的绝对位置
复制代码
-
就是说
seek(字节, [0, 1, 2])
, 会根据第二个参数指定的位置, 偏移第一个参数字节
数-
0: 从文件开始的位置
-
1: 当前文件句柄位置
-
2: 文件结尾的位置
-
注意: 1/2只能在二进制模式下使用(+b, 例如: rb, wb, ab等)
-
2、示例
r模式
下, 使用seek
方法改变文件读取的开始位置- 现有文件
test
, 内容是:1234567890
- 使用
seek方法
从起始位置偏移两个字节长度
- 程序运行后, 读取内容是
34567890
, 说明文件句柄从2的位置, 开始向后读取数据
- 上面使用的
seek(2, 0)
中, 第二个参数0, 对应的是从文件开始的位置开始偏移两个字节 - 下面使用
seek(-2, 2)
, 操作文件
- 上图中, 使用第二个参数使用
2
时, 直接报错, 这是因为1和2
都只能用在二级制方式操作文件上, 将r
改成rb
, 就可以操作文件了
- 使用
rb模式
操作文件, 可以看到打印信息时b"90"
, 其中的b
表示使用二进制方式访问文件,90
就是test
文件中最后两个数据 - 即:
seek(-2, 2)
表示将文件句柄移动到相对于文件结尾前两个字节处
3、tell()方法
-
Python
提供了tell()
方法, 可以查看文件句柄当前的位置 -
下面使用
tell
方法, 查看文件句柄的位置
二、读
1、read(字节数)
-
Python
提供了read(字节数)
方法, 来读取文件中的数据, 同时移动句柄位置 -
read(字节数)
: 字节数量默认为文件内容字节长度, 下面是在不传入字节数的情况下, 读取了test
中的全部数据
- 接着, 可以使用
seek(2, 0)
移动文件句柄位置, 在读取5个字节长度的数据, 打印:34567
2、readline([limit])
-
readline([limit])
: 读取文件中某一行数据, 一直到换行符\n
为止, 并且该行结尾的换行符\n
也会读取[limit]
: 表示最大字节数
-
我们现在
test文件
中加入第二行数据:abcdefg
- 接着使用
readline()
读取数据, 可以看到两行打印(实际还有一行\n
), 每一行后面的换行符\n
和print()
中end
的默认值\n
都被打印
3、readlines()
- readlines(): 将文件内容中数据的所有行读取出来, 放在一个数组中
- 打印:
['1234567890\n', 'abcdefg']
4、for in
-
可以使用
for in
循环遍历文件, 以及readlines()
的返回 -
首先修改
test
文件中内容
- 接着使用
for in
循环遍历文件内容, 可以看到打印信息
-
每两行中间都有一个空行, 这是因为
test
中每一行数据后都有个\n
, 再加上print()
中end
的默认值是\n
, 所以才会显示出一个空行 -
可以将
print()
中的end
换成""
空字符串, 再次运行程序, 空行就没有了
- 还可以使用
for in
遍历readlines()
返回的数组
5、readable(): 判定文件是否可读
-
已知在
a模式
和w
模式下, 文件都是不可读的, 如果读取文件程序会直接报错 -
我们可以使用
readable()
方法, 来判定文件是否可读 -
接下来, 使用
readable()
判定w模式
下, 文件是否可读, 结果: 文件不可读
- 使用
readable()
判定r模式下
, 文件是否可读, 结果: 文件可读
注意:
- 一般文件特别大的时候, 可以使用readline方法, 按行加载, 可节省内存, 但是相比于其他两个读取方法, 性能较低
- read(字节数)和readlines方法, 一次性读取文件所有内容, 占用内存较多, 但是性能比较高
三、写
1、write("内容")
-
Python
提供了方法write(内容)
, 将数据写入文件中, 并返回写入内容字节长度 -
下面在
a模式下
, 将hellow
写入到文件test
中
2. writable(): 判定文件是否支持写入操作
- 在
r模式
下, 判断文件是否可以写入, 结果: 文件不可写入
- 在
a模式
下, 判定文件是否可以写入, 结果: 文件可写入
四、关闭
-
在操作文件的时候, 有可能出现短时间内多次写入操作, 即写入频率高
-
如果每一次写入都立即存储到磁盘, 那么就会消耗大量的性能
-
所以为了优化文件的写入操作, 在数据写入到磁盘之前, 都会先存放在缓存区, 最后一次性存储到磁盘
close(): 关闭文件, 释放系统资源, 同时将缓冲区内容一次性写入到磁盘中
- 在操作磁盘的时候, 会占用系统的资源, 而
close()
方法, 可以释放这些资源, 同时将缓冲区中的内容写入到磁盘中
flush()
- 在我们操作文件的时候, 如果想要立即将缓冲区内容写入到磁盘, 同时又不想关闭文件, 那么就可以使用
flush()
方法 flush()
: 将缓冲区的内容立即写入到磁盘, 同时不关闭文件操作, 不释放相关资源