• python文件处理


    文件操作分为读、写、改

     

     一.文件读取(打开文件,r只读模式,默认模式,文件必须存在)

    f = open(file='test.txt',mode='r',encoding='utf-8')
    data = f.read()
    f.close()
    
    file='test.txt'                   表示文件路径
    mode='r'                                          表示只读(可以修改为其他)
    encoding='utf-8'                                  表示将硬盘上的 0101010 按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的 01010101,unicode对照表中有01010101和字符的对应关系。
    f.read()                                          表示读取所有内容,内容是已经转换完毕的字符串。
    f.close()                                         表示关闭文件

    PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码。

    过程:

    1、由应用程序向操作系统发起系统调用open(...)
    2、操作系统打开该文件,并返回一个文件句柄给应用程序
    3、应用程序将文件句柄赋值给变量f
    文件句柄 = open('文件路径', '模式','编码')
     
    循环读取文件内容
     
    f = open("test.txt",'r',encoding="utf-8")
    for line in f:
        print(line)
    f.close()
    
     
    文件读取 rb 二进制模式读,文件必须存在。
     
    f = open(file='test.txt',mode='rb')
    print(f.read().decode('utf8'))
    f.close()
    
    数据读到内存里直接是bytes格式,看内容,还需要手动decode,因此在文件打开阶段,不需要指定编码
     
     
     二.文件写入(w,只写模式,不可读,不存在则创建,存在则清空内容)
     
    f = open(file='test.txt',mode='w',encoding='utf-8')
    f.write('llllll')
    f.close()
    
    encoding='utf-8'                                     将要写入的unicode字符串编码成utf-8格式
    f.write(...)                                         表示写入内容,写入的内容是unicode字符串类型,内部会根据encoding转换为制定编码的 01101010101,即:字节类型

    文件写入wb,二进制只写模式,不可读,不存在则创建,存在则清空内容

    f = open('a.txt','wb')
    print(f.write('hello'.encode('utf8')))
    f.close()
    

    追加:把内容追加到文件尾部(不删除之前内容)

    f = open(file='test.txt',mode='a',encoding='utf-8')
    f.write('llllll')
    f.close()
    

     三.文件修改

    1.将文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存写到硬盘上(例如:word,vim等编辑器)

    import os
    with open('test.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f:
        data=read_f.read() #全部读入内存,如果文件很大,会很卡
        data=data.replace('aaa','bbb’) #在内存中完成修改
        write_f.write(data) #一次性写入新文件
     
    os.remove('a.txt')
    os.rename('tmp','a.txt')
    
    2.将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
    import os
    with open('a.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f:
        for line in read_f:
            line=line.replace('aaa','bbb')
            write_f.write(line)
    os.remove('a.txt')
    os.rename('tmp','a.txt')
    

    四.其他

    1.使用with不用关闭文件
    with open('test.txt','a',encoding='utf-8') as f:
        con = f.write('000')
        print(con)
    

    2.模式总结

    文本模式

     r,只读模式:默认模式,文件必须存在,不存在则抛出异常

    w,只写模式:不可读,不存在则创建,存在则清空内容

    a,追加写模式:不可读,不存在则创建,存在则只追加内容

    字节模式(对于非文本文件如图片、视频,不用考虑字符编码)

    rb,二进制只读模式:默认模式,文件必须存在,不存在则抛出异常

    wb,二进制只写模式:不可读,不存在则创建,存在则清空内容

    ab,二进制追加写模式:不可读,不存在则创建,存在则只追加内容

    读写模式

    r+,读写:可读,可写,从文件开头写入

    w+,写读:可读,可写,清空后再写

    a+,写读:可读,可写,从文件末尾写入

    3.操作方法

    f.read() #读取所有内容,光标移动到文件末尾

    f.readline() #读取一行内容,光标移动到第二行首部

    f.readlines() #读取每一行内容,存放于列表中,返回一个list

    f.write('1111 222 ') #针对文本模式的写,需要自己写换行符

    f.write('1111 222 '.encode('utf-8')) #针对b模式的写,需要自己写换行符

    f.writelines(['333 ','444 ']) #文件模式

    f.writelines([bytes('333 ',encoding='utf-8'),'444 '.encode('utf-8')]) #b模式

    f.flush() #立刻将文件内容从内存刷到硬盘

    f.readable() #文件是否可读

    f.writable() #文件是否可读

    f.closed #文件是否关闭

    f.encoding #如果文件打开模式为b,则没有该属性

    4.光标操作

    f.tell() 读取指针的位置

    f.seek(0) 设置指针的位置(0回到开头)

    truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

    read(3) 文件打开方式为文本模式时,代表读取3个字符,文件打开方式为b模式时,代表读取3个字节

    seek,tell,truncate光标移动都是以字节为单位

    seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

    5.不知道文件编码的情况

    import chardet
    
    f = open('log',mode='rb')
    data = f.read()
    f.close()
    
    result = chardet.detect(open('log',mode='rb').read())
    print(result)
     输出:

    {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

     百分之九十九的可能为 GB2312

  • 相关阅读:
    [命令]在uboot下查看文件系统的目录结构
    (DNS)dnsmasq部署DNS
    [iptables]iptables常规设置
    [net]ftp ssh http telnet https服务及端口
    [shell]shell 中| && || () {} 用法以及shell的逻辑与或非
    React躬行记(5)——React和DOM
    React躬行记(4)——生命周期
    React躬行记(3)——组件
    React躬行记(2)——JSX
    React躬行记(1)——函数式编程
  • 原文地址:https://www.cnblogs.com/zhaohw127/p/10560317.html
Copyright © 2020-2023  润新知