问题描述
文件被打开后即可以执行写操作,也可以进行读操作,那么怎么控制文件从什么地方开始读写呢?这就要求文件以读写的方式打开,同时使用一个文件指针指向文件字节流的位置,调整指针的位置就可以对文件进行任意位置的读写了。
解决方案
文件操作有下列三个步骤:
打开文件:就是从磁盘中读取文件到内存中,获取一个文件字节流。
读写文件:就是修改或增长文件的这个字节流。
关闭文件:就是把内存中的字节流写到磁盘中,以文件的形式保存。
在程序看来,文件就是由一连串的字节组成的字节流,每个字节都有一个位置编号,在第n个字节后面有一个文件结束标志EOF(Eed Of File)。
如下为文件模型,该文件有6个字节。
它们分别为Ox41,Ox42,Ox43,Ox41,Ox42,Ox61。
字节值 | 41 | 42 | 43 | 41 | 42 | 61 | EOF |
---|---|---|---|---|---|---|---|
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
指针 |
表1 文件模型
文件是一个字节流,读写哪个字节必须要指定这个字节的位置,这是由文件指针来决定的。如字节流有n个字节,p是指针位置(0<=p<=n-1),那么读写规则如下:
(1)0<=p<=n-1时,指针指向一个文件字节,可以读出该字节,读完后指针会自动指向下一个字节,既p会自动加1;若p指向EOF的位置,则不能读出任何文件字节,EOF通常是循环读文件的循环结束条件。
(2)0<=p<=n-1 时,指针指向一个文件字节,可以写入一个新的字节,新的字节将覆盖旧的字节,之后指针会自动指向下一个字节,既p会自动加1;若p指向EOF的位置,则新写入的字节会变成第n 1个字节,EOF向后移动一个位置,在字节流的末尾写入会加长文件字节流。
Python使用tell函数获取当前文件指针的位置,方法是:
文件对象.tell()
代码语言:javascript复制
fobj=open('c:\abc.txt','wt')
print(fobj.tell())
fobj.write('abc')
print(fobj.tell())
fobj.write('我们')
print(fobj.tell())
fobj.close
使用feek函数来移动文件指针,方法是:
文件对象.seek(offset[,whence])
代码语言:javascript复制
def writeFile0):
fobj=open("c:\abc.txt","wt ")print(fobj.tell())fobj.write("123")print(fobj.tell())fobj.seek(2,0)print(fobj.tell())fobj.write("abc")print(fobj.tell())fobj.close()
def readFile():
fobj=open("c:\abc.txt","rt ") rows=fobj.read()
print(rows)fobj.close()
try:
writeFile()readFile()
except Exception as err:
print(err)
结语
通过学习可以发现,文件按‘rt’‘wt’或者‘rt ’‘wt ’这两种不同模式打开时,文件的可操作性是不一样的。如果按前者打开,那么就是只读或只写;如果按后者打开,就是既可读又可写。通过这样对文件指针的调整,就可以解决随意控制文件读写的问题。