文件指针的移动,文件的修改
一、可读、可写
#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'
python之基础知识大全