zoukankan      html  css  js  c++  java
  • 读取文件最后一行 f.seek(offset,whence=0),文件操作

    file.seek()方法标准格式是:seek(offset,whence=0)offset:开始的偏移量,也就是代表需要移动偏移的字节数, whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。默认为0

    whence 的默认参数是0。

    whence 还有两种情况 是1,或者2:

    1的时候,相对当前坐标的移动,可以是正的也可以是负的。

    2的时候相对于文件结束的移动,通常应该是负的。

    f=open('d.txt','rb')
    
    for i in f:
        offs=-3
        n=1
        while True:
            f.seek(offs,2)
            print(f'你好啊这是第{n}次',f.readline(),offs)
            data=f.readlines()
            print('data',data)
    
            if len(data) > 1:
                print('最后一行',data[-1].decode('utf-8'))
                break
            offs*=2
            n += 1
    输出:
    f=open('d.txt','rb')
    
    for i in f:
        offs=-3
        n=1
        while True:
            f.seek(offs,2)
            print(f'你好啊这是第{n}次',f.readline(),offs)
            data=f.readlines()
            print('data',data)
    
            if len(data) > 1:
                print('最后一行',data[-1].decode('utf-8'))
                break
            offs*=2
            n += 1
    
    

    文件 d.txt:

    123hello
    123hello
    123asdfasdfasdf
    哼123456789哈
    

    示例2:

    f=open('seek.txt','rb')
    
    print(f.tell())
    f.seek(-5,2)
    print(f.read())
    print(f.tell())
    f.seek(3,1)
    print(f.read())
    print(f.tell())
    
    输出: 
    f=open('seek.txt','rb')
    
    print(f.tell())
    f.seek(-5,2)
    print(f.read())
    print(f.tell())
    f.seek(3,1)
    print(f.read())
    print(f.tell())
    

    seek.txt文件

    hello
    你好王八蛋
    123456
    abcdef
    
    f=open('seek.txt','rb')
    print(f.tell())
    f.seek(10,1)
    print(f.tell())
    f.seek(3,1)
    print(f.tell())
    输出:
    0
    10
    13
    
    f=open('seek.txt','rb')
    print(f.tell())
    f.seek(10,1)
    print(f.tell())
    f.seek(3,1)
    print(f.tell())
    输出:
    0
    10
    3
    
    f=open('b.txt','r+',encoding='utf-8')
    data=f.read()
    print('000000000000',data)
    f.write('
    你好')
    f.seek(0)
    data=f.read()
    print('11111111111',data)
    输出:
    000000000000 你好
    he你好
    你好
    11111111111 你好
    he你好
    你好
    你好
    

    Python3 的encode和decode,open

    此处的b.txt是utf-8编码文件

    你好
    he你好
    你好
    你好
    
    #f=open('b.txt','r+',encoding = 'utf-8')  # 此处的b.txt是utf-8编码写进去的
    f=open('b.txt','r+')  # 在window是系统中默认是gbk编码,  open如果没有指定encoding,默认是以系统的默认编码进行decode打开的str
    b_read =f.read()       # f.read()是以打开文件后decode('gbk')后的str
    print('01: ',b_read,type(b_read))     
    print('------------01 over----------------
    ')
    
    gbk_encode_data=b_read.encode('gbk')  # 将上面的str以原本的gbk编码,进行编码encode('utf-8')变成二进制的unicode  bytes编码
    print('02: ',gbk_encode_data,type(gbk_encode_data))  
    print('------------02 over----------------
    ')
    
    utf8_decode_data=gbk_encode_data.decode('utf-8')   # 将二进制的unicode编码进行utf-8解码,变为我们认识的字符串
    print('03',utf8_decode_data,type(utf8_decode_data))
    print('------------03 over----------------
    ')
    
    输出:
    01:  浣犲ソ
    he浣犲ソ
    浣犲ソ
    浣犲ソ <class 'str'>
    ------------01 over----------------
    
    02:  b'xe4xbdxa0xe5xa5xbd
    hexe4xbdxa0xe5xa5xbd
    xe4xbdxa0xe5xa5xbd
    xe4xbdxa0xe5xa5xbd' <class 'bytes'>
    ------------02 over----------------
    
    03 你好
    he你好
    你好
    你好 <class 'str'>
    ------------03 over----------------
    

    以二进制的b进行打开文件

    a.txt是gbk编码写的
    你好啊,美女

    f=open('a.txt','rb')
    # data=f.read().decode('gbk')
    data_b=f.read()
    print(data_b,type(data_b))
    data=data_b.decode('gbk')
    print(data,type(data))
    输出: 
    b'xc4xe3xbaxc3xb0xa1,xc3xc0xc5xae' <class 'bytes'>
    你好啊,美女 <class 'str'>
    
    f=open('b.txt','r+',encoding = 'utf-8')
    data_b=f.read()
    print(data_b,type(data_b))
    输出:
    你好
    he你好
    你好
    你好 <class 'str'>
    
    f=open('a.txt','r')  # 对于gbk编码的,在本地的window系统中,没有指定encoding,默认是以本系统的编码进行解码的
    data_b=f.read()
    print(data_b,type(data_b))
    输出:
    你好啊,美女 <class 'str'>
    

    其他的待验证

    # f=open('b.txt','r',encoding='utf-8',newline='') #读取文件中真正的换行符号
    f=open('b.txt','r',newline='') #读取文件中真正的换行符号
    # f=open('b.txt','r+',encoding='utf-8',newline='') #读取文件中真正的换行符号
    
    print(f.closed)
    print(f.encoding)
    f.flush()
    print(f.readlines())
    
    print(f.tell())
    # print(f.readline())
    print(f.tell())
    data=f.read(1)
    print(data)
    f.truncate(10)
    
    # f.flush() #讲文件内容从内存刷到硬盘
    # f.closed #文件如果关闭则返回True#
    # f.encoding #查看使用open打开文件的编码
    # f.tell() #查看文件处理当前的光标位置
    # f.seek(3) #从开头开始算,将光标移动到第三个字节
    # f.truncate(10) #从开头开始算,将文件只保留从0-10个字节的内容,文件必须以写方式打开,但是w和w+除外
    
    写入自己的博客中才能记得长久
  • 相关阅读:
    MySQL关键性能监控(QPS/TPS)
    Python小技巧
    Redis高可用演进(一)
    防范XSS攻击
    java引用知识
    ehcache同步原理
    ehcache监控
    SecureCRT使用技巧
    JUC整理笔记五之梳理Varhandle(下)
    JUC整理笔记四之梳理VarHandle(上)
  • 原文地址:https://www.cnblogs.com/heris/p/14763376.html
Copyright © 2011-2022 走看看