0
点赞
收藏
分享

微信扫一扫

网络编程(part5)--文件读写偏移量及文件描述符

鄙人学习笔记


文章目录

  • ​​文件读写偏移量(文件指针)​​
  • ​​定义​​
  • ​​举个例子1(读写操作的文件偏移量)​​
  • ​​举个例子2(文件偏移量的初始位置验证)​​
  • ​​基本操作​​
  • ​​举个例子1(tell()函数)​​
  • ​​举个例子2(tell()函数)​​
  • ​​举个例子3(seek()函数)​​

  • ​​文件描述符​​
  • ​​定义​​
  • ​​获取文件描述符​​
  • ​​举个例子​​


文件读写偏移量(文件指针)

定义

打开一个文件进行操作时,系统会自动生成一个记录,记录中描述了我们对文件的一系列操作。其中包括每次操作到的文件位置文件的读写操作都是从这个位置开始进行的

备注:在我们open一个文件时,就有了这个文件偏移量,但是当我们重新open的话,这个文件偏移量会被刷新。要注意的是,我们的读写操作用的是同一个文件偏移量。

举个例子1(读写操作的文件偏移量)

康一康下面这段代码:
网络编程(part5)--文件读写偏移量及文件描述符_python

结果:
网络编程(part5)--文件读写偏移量及文件描述符_文件描述符_02

我们发现,我们明明写入数据了鸭~为啥,啥都没打印出来?这是为啥呢?

这一切都使偏移量的错,都是你!
因为我们一个文件对象,只拥有一个文件偏移量,无论是读取还是写入,用的都是同一个偏移量。当我们写完”hello world”这个字符串时,文件偏移量就到末尾了。这时,我们再想进行读取,就是从偏移量的位置(末尾)向后读取,所以我们啥也读不到。

举个例子2(文件偏移量的初始位置验证)

看以下一段代码:
网络编程(part5)--文件读写偏移量及文件描述符_文件描述符_03

结果:
网络编程(part5)--文件读写偏移量及文件描述符_fileno_04

我们发现,没有任何东西被打印出来,这是咋回事呢?这说明,当我们用追加操作a的方式打开文件时,文件偏移量在最末尾,所以我们读不到任何东西。
备注:读取r和写入w的打开方式,文件偏移量在最开头。

基本操作

①tell

tell()

功能:获取当前的文件偏移量,表示从开头位置,向后偏移了多少。

②seek

seek(offset[,whence])

功能:移动文件偏移量位置
参数
offset代表相对于某个位置偏移量。可以是负数表示向前移动。
whence代表基准位置。默认值为 0,代表从文件开头算起;1代表从当前位置算起,2 代表从文件末尾算起。

举个例子1(tell()函数)

首先我们先看一下test文件中的数据:
网络编程(part5)--文件读写偏移量及文件描述符_fileno_05

看以下一段代码:
网络编程(part5)--文件读写偏移量及文件描述符_python_06

输出结果:
网络编程(part5)--文件读写偏移量及文件描述符_网络编程_07

我们可以看到,test文件内有11个字节,我们的当前的文件偏移量为11,正好验证了我们之前说的【追加操作a的方式打开文件时,文件偏移量在最末尾】

举个例子2(tell()函数)

输出结果:
网络编程(part5)--文件读写偏移量及文件描述符_文件读写偏移量_08

由结果可知,我们读俩字符,指针就向后走两位。
网络编程(part5)--文件读写偏移量及文件描述符_python_09

举个例子3(seek()函数)

我们先康一康下面这一段代码:
网络编程(part5)--文件读写偏移量及文件描述符_网络编程_10

结果:
网络编程(part5)--文件读写偏移量及文件描述符_fileno_11

如果我想在第二次读取文件时,让它从头读取呢?

这时,我们可以通过人为调整偏移量,来实现:
网络编程(part5)--文件读写偏移量及文件描述符_文件描述符_12

结果:
网络编程(part5)--文件读写偏移量及文件描述符_fileno_13

完整代码:

fd = open('test','r+')

#相对开头位置向后偏移了多少
print("当前文件偏移量位置:",fd.tell()) #0
print(fd.read(2))
print("当前文件偏移量位置:",fd.tell()) #2

#人为调整文件偏移
fd.seek(0,0) #相对开头位置向后偏移0个字节
print(fd.read(2))

fd.close()

文件描述符

定义

系统中,每一个IO操作都会被分配一个整数作为编号,该整数即这个IO操作的文件描述符。文件描述符是不会重复的。

获取文件描述符

  • 获取文件描述符函数
fileno()

通过IO对象获取对应的文件描述符。

举个例子

代码和结果放一起:
网络编程(part5)--文件读写偏移量及文件描述符_python_14

举报

相关推荐

0 条评论