文件指针的移动,文件的修改

一、可读、可写

#r+t:可读、可写

'''b.txt内容:你多大'''
#w+t:可写、可读
# with open('b.txt','w+t',encoding='utf-8') as f:
#     print(f.readable())      #判断结果为True,说明w+对文件可读可写
#     print(f.writable())
#a+t:可追加写、可读

#r+b
#w+b
#a+b

# with open('b.txt',mode='rb') as f:  #b模式下不需要指定字符编码
#     data=f.read()                   #一次全部读取文件中的内容
#     print(data)                     #b'\xe5\xa4\xa7\xe5\xa4\x9a\xe4\xba\xba'  b模式下是以bytes为单位可以理解为二进制,所以打印要进行解码decode
#     print(data.decode('utf-8'))     #大多人


# with open('b.txt',mode='rt',encoding='utf-8') as f:
#     data=f.read()                      #t模式下是以str为单位,所以打印的结果为大多人
#     print(data)


'''a.txt内容:
111111111111
2222
3333
3333
44444小红帽小红帽小红帽'''
# with open('a.txt',mode='r+',encoding='utf-8') as f:
#     print(f.readline())       #每次读取文件的一行内容
#     print(f.readline())       #指针移到行首,读取一行,并进行换行
#     print(f.readlines())     #将文件的内容全部读取出来,以字符串的形式放入到一个列表中
#     f.write('小红帽')       #r+模式,默认是将添加的内容,添加到文件的末尾

二、文件指针的移动

# 文件中指针的移动
# f.seek(offset,whence)。。。。。。。。。。。。
#offset代表文件的指针的偏移量,单位是字节bytes
#whence代表参考物,有三个取值
#0:参照文件的开头
#1:参照当前文件指针所在位置
#2: 参照文件末尾,(所以此时偏移量应该为负值)
#ps:快速移动到文件末尾f.seek(0,2)

'''
c.txt内容:
大多人的帅都是我擦了在表面的帅,只有egon的帅才是发自内心的
两个黄丽鸣翠柳,一行白鹭上青天
在egon美丽的外表下隐藏了一颗骚动的心
这颗心叫七窍玲珑心
男人吃了会流泪
女人吃了会怀孕
'''
#强调:其中whence=1和whence=2只能在b模式下使用
# f=open('c.txt',mode='rt',encoding='utf-8')
# f.seek(9,0)     #移动的偏移量9的单位是bytes,即在utf-8下,移动三个中文字符
# print(f.tell()) # 每次统计都是从文件开头到当前指针所在位置
# print(f.readline())  #指针移动9个bytes,此时参照文件的开头,读取第一行的内容为:的帅都是我擦勒浮在表面的帅,只有egon的帅才是发自内心的
# f.close()


# f=open('c.txt',mode='rb')
# f.readline()     #此时文件的指针已经移到了第二行的开头
# f.seek(6,1)    #相对当前位置,移动6个bytes,即指针移动了两个中文的字符的长度
# print(f.readline().decode('utf-8'))     #以指针移动后的结果继续往后读完一行内动,并将bytes进行解码
# print(f.tell())     # 每次统计都是从文件开头到当前指针所在位置,
# f.close()


# f=open('c.txt',mode='rb')
# f.seek(-9,2)       #相对文件末尾进行移动9个bytes所以偏移量应该为负值
# print(f.readline().decode('utf-8'))   #会怀孕
# print(f.tell())       # 每次统计都是从文件开头到当前指针所在位置,264
# f.close()



# 了解(**)
# 只有在t模式下的read(n),n代表的是字符个数,除此之外其他但凡涉及文件指针的移动都是以字节为单位的
# f=open('c.txt',mode='rt',encoding='utf-')
# print(f.read(3))     #从文件的开头开始,读取三个字符,而不是三个字节即bytes
# f.close()

# f=open('c.txt',mode='rb',)
# print(f.read(3).decode('utf-8'))     #b模式下读取的是三个字节即3个bytes而非三个字符的长度,读取结果为:大
# f.close()


# ab a+b r+b
# f=open('b.txt',mode='at',)    #如:你多大了呀,臭傻逼,截断后结果:你多大
# f.truncate(9) # 参照物永远是文件开头,从文件开头写9个bytes,之后的内容都被截断掉,即被清除掉,是一种写文件的操作
# f.close()

三、文件修改的两种方式

# 通过指针的移动完成对文件内容的修改
# with open('c.txt','r+t',encoding='utf-8') as f:
    # f.seek(21,0)                 #从文件的开头移动21个字节,即21个bytes,
    # f.write('[我擦勒]')        #会报错,因为[我擦勒]是11个字节,不能完全替换掉源文件中的4个中文字符
    # f.write('我擦了')            #移动21个字节,然后用我擦了覆盖掉后面三个字符,而不是插入的修改,因为硬盘没有修改这么一说,
                                 #都是将内容读到内存中修改后,重新写到硬盘中取,覆盖原来的内容,从而完成对文件的修改


'''
d.txt内容:
my name is ALEXSB
ALEXSB say hahahah
ALEXSB say my name is SB
SB is ALEXSB
egon is beautiful
'''
#修改文件内容的方式一:
#思路:先将原文件内容一次性全部读入内存,然后在内存修改完毕后,再
#覆盖写回原文件
#优点:在修改期间,文件内容只有一份
#缺点:当文件过大的情况下或占用过多的内存空间

# with open('d.txt','rt',encoding='utf-8') as read_f:
#     msg=read_f.read()
#     msg=msg.replace('alex','xiang')
#     # print(msg)
#
# with open('d.txt','wt',encoding='utf-8') as write_f:
#     write_f.write(msg)

#修改文件内容的方式二:
#思路:
#1、以读的方式打开原文件,以写的方式打开一个新文件
#2、从原文件中循环读取每一行内容修改后写入新文件
#3、删除原文件,将新文件重命名为原文件的名字

#优点:同一时刻只有一行内容存在于内存中
#缺点:在修改期间,文件内容始终存在两份,但修改完毕后会只留一份
import os
with open('d.txt','rt',encoding='utf-8') as read_f,\
        open('d.txt.swap','wt',encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('xiang','ALEXSB'))    #每读一行内容,将每行中的'xiang'替换成'ALEXSB'

os.remove('d.txt') # 删除老文件
os.rename('d.txt.swap','d.txt')   #将修改后的文件'd.txt.swap'重新命名为源文件的名字'd.txt'

猜你喜欢

转载自www.cnblogs.com/sui776265233/p/9140358.html