大前提:文件内指针的移动是Bytes为单位的,唯独t模式下的read读取内容是以字符为单位的

一、read(3):

  1,。文件打开方式为文本模式时,代表读取3个字符

  2.   文件打开方式为b模式时,代表读取3个字节

二、其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1.seek有三种移动方式0 ,1 ,2,其中1,2必须在b模式下进行,但无论哪种模,都是以bytes为单位移动的

        

  2.truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或者a+等模式下测试效果

模式控制:

  0:默认的模式,该模式指针代表指针移动的字节数是以文件开头为参照的

  1:该模式代表指针移动的字节数是以当前所在位置为参照的

  2,:该模式代表指针移动的字节数是以文件末尾的位置来参照的

    #强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

#f.tell()查看文件指针当前距离文件开头的位置

#with open('a.txt',mode='rt',encoding='utf-8')as f:

#        f.seek(4.0)

#   print(f.tell)

#   print(f.read)

 

with open ('a.txt',mode='rb') as f

  f.seek(4,0)

  print(f.tell())

  print(f.read().decode('utf-8')

 

文件的修改:

  文件的数据是存放在于硬盘上,因而只存在覆盖,不存在修改一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:

    将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,在由内存覆盖到硬盘(word,vim,nodpadd++等编辑器)

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡
data=data.replace('alex','SB') #在内存中完成修改

write_f.write(data) #一次性写入新文件

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')

方式二:

将硬盘存放的该文件的内容一行一行地读入内存,修改完毕 就写入新文件,最后用新文件覆盖原文件

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
for line in read_f:
line=line.replace('alex','SB')
write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')

 

posted on 2018-09-21 14:42  frank007  阅读(212)  评论(0编辑  收藏  举报