• Python之文件操作


    一、文件读写模式

    python文件的读写很简单,仅仅是一个open函数。

    打开文件方式有:

    open(绝对路径/'文件名’,读写模式,encoding='utf-8'),open这种方式打开文件,操作后,要关闭文件;

    with open('文件名‘,读写模式,encoding='utf-8')as f.with这种方式打开文件,自动会关闭文件。

    文件操作的三步骤:

    1、打开文件获取文件句柄,句柄就理解是这个文件;

    2、通过文件句柄操作文件

    3、关闭文件

    注意:理解句柄的概念

    在stdio.h中声明
    typedef struct{
        short         level;           //缓冲区满与空的程度
        unsigned      flags;    //文件状态标志
        char          fd;               //文件描述符
        unsigned char hold;     //无缓冲区,不读字符
        short         bsize;          //buffer大小
        unsigned char *curp;   //当前指向
        unsigned      istemp;    //临时文件知指示
        short         token;        //有效性检测
    }    FILE;

    为了管理打开的文件,系统为所有文件创建了一个打开文件信息的结构体数组,文件句柄就是每个文件的唯一标识符,是文件在内存中的存储位置。句柄顾名思义,打开后要关闭才能再次打开。所以更新文件后,一定要先关闭文件,再次读取读到更新后的文件内容。

    文件读取模式: 

    fr=open('a.txt','r')
    print(fr.read())
    fr.write('qiuqiqu,123456QQ')
    print(fr.read())
    运行结果:
    liuyihan,123456YH
    Traceback (most recent call last):
      File "E:/自动化测试/LYH_python/Day4作业/file.py", line 3, in <module>
        fr.write('qiuqiqu,123456QQ')
    io.UnsupportedOperation: not writable

     r:只读模式,打开不存在的文件时,报错;读完文件后,文件指针在末尾

     w:只读模式,会清空原来的文件内容;打开不存在的文件时,直接帮你新建一个文件;

     a:追加写模式,在原文件内容末尾追加新内容;打开不存在的文件时,直接帮你新建一个文件。

     r+:可读,可写,可追加模式,打开不存在的文件时,帮你新建一个文件。

    a.txt文件内容:、
    liuyihan,123456NN
    qiuuqiu,123456QQ
    nuanuan,123455NN
    
    fr=open('a.txt','r+')
    fr.write('niuhanyang,123456NN')
    print(fr.read())
    
    运行结果:
    qiuqiu,123456QQ
    nuanuan,123455NN

    以上程序,你有看懂吗?文件写时,文件指针在首行,所以liuyihan,123456YH 被修改为niuhanyang,123456NN,这时文件指针在第二行。读取文件时,read()将第二行和第二行以后的内容读出来。所以显示结果如上图所示。

      w+:写读模式,写时会把原来文件内容清空,可读取已写入的文件内

      a+:追加读写内容,不存在的文件会自动创建,存在则只追加内容。

    file.txt文件内容:
    liuyihan,123456YH
    qiuqiu,123456QQ
    
    fr=open('a.txt','a+')
    fr.write('niuhanyang,123456NN
    ')
    fr.seek(0)
    print(fr.read())
    
    运行结果:
    liuyihan,123456YH
    qiuqiu,123456QQ
    niuhanyang,123456NN

    上面程序,若不加fr.seek(0),读取结果为空,因为追加写,文件指针在末尾,读取时读不到东西,seek()方法就是把文件指针指向那个位置。0代表首行。

    二、文件操作方法

    f = open('file.txt','a+',encoding='utf-8')
    f.read()#读取文件所有内容,返回字符串类型
    f.readline()#读取文件第一行内容,返回字符串类型
    f.readlines()#一行一行读,获取文件所有内容,返回一个List,文件的每行内容作为List的每个元素
    f.write()#将字符串写入文件,只能是字符串类型
    f.writelines()#将一个序列字符串列表写入文件,需要换行时自己手动添加
    
    f.seek(0)#文件指针指向哪个位置
    f.tell()#获取当前文件的指针指向
    f.flush()#写入数据后,立即把数据从内存写到磁盘中
    f.truncate()#清空文件内容
    import os
    os.remove('file.txt')#删除文件
    os.rename('file.txt','new_file.txt')#文件重命名

    注意:用上方read()和readlines()方法操作文件时,当文件很大时,会将文件所有内容读到内存中,很容易引起内存撑爆。高效的操作就是,读一行操作一行,然后读过的内容从内存中释放。如以下代码:

    三、修改文件

    修改文件有两种方式:

    第一种:读取文件所有内容,将文件内容修改后,清空文件所有原内容,再将修改后的文件内容重新写入;

    注意:指明文件绝对路径时,路径中若含有 、 、s等转义字符,在路径前加r,意思是文件路径中的 、 等不是转义字符。

    第二种:将修改后的内容写入一个新文件。

    四、处理json字符串

    S='''
    {
            "error_code": 0,
            "stu_info": [
                    {
                            "id": 309,
                            "name": "小白",
                            "sex": "女",
                            "age": 26,
                            "addr": "河南省济源市北海大道32号",
                            "grade": "天蝎座",
                            "phone": "18512572946",
                            "gold": 100
                    },
                    {
                            "id": 310,
                            "name": "小黑",
                            "sex": "男",
                            "age": 26,
                            "addr": "河南省济源市北海大道32号",
                            "grade": "天蝎座",
                            "phone": "18516572946",
                            "gold": 120
                    }
            ]
    }
    '''
    mport json
    res = json.loads(S) #json串(字符串),转成字典
    print(res)#打印出字典
    
    stus={'xiaojun':'123456','xiaohei':'7891','tanailing':'11111'
            ,'海龙':'111'}#定义一个字典
    res2=json.dumps(stus,indent=8,ensure_ascii=False)#将字典转换成json字符串,Ensure_ascii=False是防止中文报错
    print(res2)#打印出json字符串
    
    with open('stus.json','w',encoding='utf-8') as f:#将字典转换成json字符串,然后再写入文件stus.json中
        f.write(res2)

    以上程序,最终创建了一个stus.json文件,里面内容为json类型

    4.1如何从文件中读取json数据

    第一种方式:用loads(),将文件的所有内容读出来(json字符串类型),转换成字典,再打印出字典,从而获取到文件内容

    第二种方法:用load(),直接操作文件,将json字符串转换成字典,再打印出字典,从而获取文件内容。

    4.2 如何将json数据写入文件

    第一种方法:用dumps(),将字典转换成json字符串类型,再写入文件

    第二种方法:用dump(),直接操作文件,传入字典和文件,将字典直接转换成json字符串类型,写入文件。

    注意:从上述程序,不难发现,很好记忆,带s的函数是处理json字符串的,不带s的可直接处理文件。

  • 相关阅读:
    IconRes提供免费高质量的Material风格android官方图标库
    android中的所谓观察者模式
    Android总结篇——Intent机制详解及示例总结
    SpringMVC注解@initbinder解决类型转换问题
    ubuntu16.04上安装tomcat7
    ImportError: No module named corsheaders
    linux 网卡
    工控机安装Ubuntu14.04
    python2安装django
    Ubuntu14.04 terminal添加右键
  • 原文地址:https://www.cnblogs.com/balllyh/p/9581900.html
Copyright © 2020-2023  润新知