zoukankan      html  css  js  c++  java
  • Python从入门到超神之文件处理

    一、文件处理流程(python默认是utf-8编码)

    打开文件函数:open(文件路径,encoding=‘utf-8’)注意:open会检索系统的编码,所以需要调整一致否则报错

    例如:fi=open('Alex',encoding=‘utf-8’)

       fi.read() 读取出文件中所有数据

          fi.readline()  一行一行读取,一次读取一行。若是没有了,则读取空行

       readlines()   方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。如果碰到结束符 EOF 则返回空字符串。

    fi=li.open('文件名',encoding='utf-8')
    
    print('第1行',f.readline(),end="")
    print('第2行',f.readline(),end="")
    print('第3行',f.readline(),end="")
    print('第4行',f.readline(),end="")
    
    =====>>  1111111111111
             2222222222222
             3333333333333           #每行输出后无空格
             4444444444444

    注意:一旦使用read后,在使用readline则无效,因为已经读取完了。fi.readlines()  #读取多行,一行输出

    写文件操作

    f=open('hello.txt','w',encoding="utf-8")
    f.write('1111111
    ')
    f.write('2222222
    ')
    f.close()
    
    #写模式只能写不能读,若文件存在会把内容直接清除掉;不存在则建立一个空文档
    #无论是写还是读,都是字符串,不能是数字
    f.writeable()  #判断是否文件可写
    f.writelines([‘555555
    ’,'666666
    ',‘777777
    ’]) #写一个列表传给文件,列表中为内容

    追加操作

    open('a.txt','a',encoding='utf-8')

    # a 在后面追加记录
    f=open('a.txt','a',encoding='utf-8')
    f.write('99999999')
    f.close()
    #r+ 即可读又可写
    #文件没有修改一说,所谓修改就是覆盖掉
    f=open('a.txt','r+',encoding='utf-8')
    data=f.read()
    print(data)
    f.write('123abc')
    a=open('a.txt','r+',encoding='utf-8')
    data=a.readlines()
    a.close()
    
    des_f=open('xxx_new','w',encoding='utf-8')
    des_f.write(data[0])
    des_f.close()
    
    #with的好处就是不用关闭文件。
    with open('a.txt','w',encoding='utf-8') as f,
            open('xxx_new','r',encoding='utf-8'):
        data=a.read()
        des_f.write(data)

    w+,写读(可读可写)

    x+,写读(可读可写)

    a+,写读(可读可写)

    当文件不能以文本方式进行修改时,我们要用b(字节)模式进行处理。

    注意:b 表示以bytes模式(字节)方式读/写,b的方式不能指定编码

    rb     r+b  wb  w+b   xb   x+b   ab    a+b

    #两种方法进行b模式写操作,一是将文本用bytes()函数转换为字节型,二是直接对其进行‘utf-8’解码,因为系统硬盘上默认是字节形式存储数据的
    f=open('xxx_new','wb')
    f.write(bytes('11111111
    hello,boy
    123145','utf-8'))
    f.write('11111111
    hello,boy
    123145'.encode('utf-8'))
    #newline读取文件中的真正换行号  
    
    f=open('xxx_new','r+',encoding='latin-1',newline='') 
    print(f.closed)      #判断文件是否关闭
    print(f.encoding)           #文件打开时的编码,与硬盘上编码形式无关
    f.closed)       判断文件是否关闭
    f.encoding      文件打开时的编码,与硬盘上编码形式无关
    f.flush()    把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。
    f.name 返回文件名
    f.tell() 光标当前所在位置,默认打开时位置为0 以字节方式计算位置,一个汉字3个字节,换行是两个字符
    f.isatty() 是不是终端设备
    f.truncate(10) 用于截断文件并返回截断的字节长度。从开头到第十个位
    f.seek(offset,whence=0) 移动文件读取指针到指定位置。按字节进行移动,若操作成功,
    则返回新的文件位置,如果操作失败,则函数返回 -1.
    offset:开始的偏移量,需要移动偏移的字节数

    whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

    例如:f.seek(4,5) 表示从第五个位置开始偏移4个字节长度

    #seek高级玩法  必须要以'b'模式进行操作,否则会报错
    #seek使用时是按字节进行计算的
    f=open('seek.txt','rb')
    print(f.tell())
    f.seek(10,1)     #默认第二个参数为0,每次都从第一个位置开始   为1时,相对于光标当前位置   
    print(f.tell())
    f.seek(3,1)
    print(f.tell())   ---------->>0  10  13
    
    #参数为2代表相对位置,倒着读,意味着倒着seek,注意第一个参数为负值
    f.seek(-10,2)             
    
     
    #seek读取文件最后一行,循环文件一行行读取
    f=open('日志文件','rb')
    for i in f:
        print(i)
    #日志文件实时读取功能
    f=open('a.txt','rb')
    for i in f:  #若是readlines太占内存,会把所有的都放置内存中,所以推荐使用for i in 文件名:
        offs=-10      #定义偏移量,代表日志中一行的字节数
        while True:
            f.seek(offs,2)
            data=f.readlines()
            if len(data)>1:
                print('文件的最后一行是%s' %(data[-1].decode('utf-8')))
                break
            offs*=2
  • 相关阅读:
    【Node.js 自己封装的库 http_parse, libuv】
    select遍历list默认选中初始值
    mybatis入门基础----高级映射(一对一,一对多,多对多)
    工具类 | window批处理杀死指定端口进程
    eclipse 关闭控制台 自动弹出
    mybatis的jdbcType和javaType、oracle,MySQL的对应类型
    mysql 创建表格 AUTO_INCREMENT
    Linux shell脚本启动 停止 重启jar包
    Tomcat结合nginx使用小结
    集成maven和Spring boot的profile功能
  • 原文地址:https://www.cnblogs.com/xtznb/p/10638316.html
Copyright © 2011-2022 走看看