一、定位
- 文件定位, 是指在操作文件时, 控制文件句柄(指针)的位置, 也就是控制文件的读取起点位置
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(): 将缓冲区的内容立即写入到磁盘, 同时不关闭文件操作, 不释放相关资源