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


    一、可读、可写

    #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'xe5xa4xa7xe5xa4x9axe4xbaxba'  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'
  • 相关阅读:
    正则表达式入门教程
    js获取class
    锋利的jQuery第6章 jQuery与Ajax的应用
    显示隐藏左侧菜单
    unicode转为汉字
    $.ajax
    .ashx文件
    c#正则表达式
    调试发现的小错误
    sql2005连接不到本地数据库
  • 原文地址:https://www.cnblogs.com/sui776265233/p/9140358.html
Copyright © 2020-2023  润新知