zoukankan      html  css  js  c++  java
  • Python基础【day03】:文件操作(六)

    一、概述

    我们工作中需要经常操作文件,下面就讲讲如何用Python操作文件

    1、文件操作的流程:

    • 打开文件,得到文件句柄赋值给一个变量
    • 通过文件句柄,对文件进行操作
    • 关闭文件

     二、入门

    1、语法

    open(文件路径,模式,字符编码)

    1
    2
    3
    4
    5
    6
    7
    8
    #获取文件句柄
    = open("yesterday","r",encoding="utf-8")
    #读取数据
    data = f.read()
    #打印读取的文件
    print(data)
    #关闭文件
    f.close()

     注: f 又叫文件句柄,它包含文件的文件名、文件的字符集、文件的大小、文件在硬盘上的起始位置

    2、两次读取文件内容

    读取内容:

    1
    2
    3
    4
    Somehow, it seems the love I knew was always the most destructive kind
    不知为何,我经历的爱情总是最具毁灭性的的那种
    Yesterday when I was young
    昨日当我年少轻狂

     代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    = open("yesterday2","r",encoding="utf-8")
    #第1次读取
    data = f.read()
    #第2次读取
    data2 = f.read()
    print(data)
    print("----------------data2-----%s----"%(data2))
    f.close()
    #输出结果
    Somehow, it seems the love I knew was always the most destructive kind
    不知为何,我经历的爱情总是最具毁灭性的的那种
    Yesterday when I was young
    昨日当我年少轻狂
    ----------------data2---------

    这边不经意间有一个小疑问:为什么data2的数据为空?

    因为在文件中 ,维护一个类似文件指针的一个东西,这个文件指针类似于我们平时操作文件时的光标的东西,所以当第1次读文件时,文件指针已经指向最后一个位置,所以第2次再去读取的时候,是从最后一个位置开始读取的,所以读取的为空。

    那怎么再重新读取数据呐?把光标移动到开始位即可。

     3、高效读取文件行

    首先我们介绍一下readline和readlines

     ①readline()

    读取一行文件

    1
    2
    3
    4
    5
    = open("yesterday","r",encoding="utf-8")
    print(f.readline())
    f.close()
    #输出
    Somehow, it seems the love I knew was always the most destructive kind

     ②readlines()

    把文件中的每一行作为一个元素形成一个列表

    1
    2
    3
    4
    5
    6
    = open("yesterday2","r",encoding="utf-8")
    print(f.readlines())
    f.close()
    #输出
    ['Somehow, it seems the love I knew was always the most destructive kind ''不知为何,我经历的爱情总是最具毁灭性的的那种 ',
    'Yesterday when I was young ''昨日当我年少轻狂']

     我们正常循环读取文件中的每一行,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    = open("yesterday2","r",encoding="utf-8")
    for index,line in enumerate(f.readlines()):
        #当下标值为2时,不打印
        if index == 2:
            print("--------data--------")
            continue
        print(line.strip())
    f.close()
    #输出
    Somehow, it seems the love I knew was always the most destructive kind
    不知为何,我经历的爱情总是最具毁灭性的的那种
    --------data--------
    昨日当我年少轻狂

    这种方法已经达到我们的目的了,可以顺利的读取每一行,但是,当我们遇到2G,20G,甚至200G的文件时,你这样读取会导致内存不够用,会使程序变的很慢,因为你的内存只有几个G,你把几十个G的数据放到内存,内存肯定是受不了的,所以这种方法只适合小文件,不适合大文件。那怎么办呢?我们于是就有下面这种方法,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    = open("yesterday2",'r',encoding='utf-8')
    #计数器
    count = 0
    #f文件变成迭代器
    for line in f:
        if count == 2:
            print("------data-----")
            count += 1
            continue
        print(line.strip())
        count += 1
    f.close()
    #输出结果
    Somehow, it seems the love I knew was always the most destructive kind
    不知为何,我经历的爱情总是最具毁灭性的的那种
    ------data-----
    昨日当我年少轻狂

     以上这种写法的好处在于,读取文件时,是一行一行的读取,而且,读取一行删除一行,内存中只保留一行。原因:f文件变成迭代器,它已经不再是一个列表的形式了,不能通过下标值来获取,需要一个计数器来计数。

    三、基本操作

    文件的基本操作,这边我需要另写一遍博客出来,因为我怕本篇博客写的太多,搞混乱了。

    四、with语句

    为了避免打开文件后忘记关闭,可以通过管理上下文,即:

    1
    2
    3
    with open('log','r') as f:
     
    ....

    如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

    在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

    1
    2
    with open('log1') as obj1, open('log2') as obj2:
        pass

     上面打开多个文件会导致一行代码过长,python官方建议,一行代码不超过80个字符,所以打开多个文件建议以下写法:

    1
    2
    3
    with open('log1') as obj1,
            open('log2') as obj2:
        pass

     五、文件修改

    1、在以后的工作中有时候会用到修改某个文件的内容,所以下面我们就讲讲,如何修改文件

         修改文件,是先读文件,一边读和操作,再一边写(写需要命令一个新的文件,成功后,把老的文件删掉,把新文件重新命名成老文件)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #读老文件
    = open("yesterday","r",encoding="utf-8")
    #写入新文件
    f_new = open("yesterday_new",'w',encoding="utf-8")
     
    for line in f:
        #一边读新文件,修改内容
        if "肆意的快乐等我享受" in line:
            line = line.replace("肆意的快乐等我享受","肆意的快乐等luoahong享受")
        #一边写入新文件
        f_new.write(line)
    #关闭文件
    f.close()
    f_new.close()

     测试内容如下:

    yesterday文件

    So many lovely songs were waiting to be sung
    有那么多甜美的曲儿等我歌唱
    So many wild pleasures lay in store for me
    有那么多肆意的快乐等我享受
    And so much pain my eyes refused to see
    还有那么多痛苦 我的双眼却视而不见

     yesterday_new文件:

    So many lovely songs were waiting to be sung
    有那么多甜美的曲儿等我歌唱
    So many wild pleasures lay in store for me
    有那么多肆意的快乐等luoahong享受
    And so much pain my eyes refused to see
    还有那么多痛苦 我的双眼却视而不见
     
     
  • 相关阅读:
    第19 章 : 调度器的调度流程和算法介绍
    第18 章 : Kubernetes 调度和资源管理
    关于一次配合开发工作而产生的服务器内核参数问题(Android 网络问题)
    第17 章 : 深入理解 etcd:etcd 性能优化实践
    第16 章 : 深入理解 etcd:基于原理解析
    第15 章 : 深入解析 Linux 容器
    第14 章 : Kubernetes Service讲解
    第13 章 : Kubernetes 网络概念及策略控制
    第12 章 : 可观测性-监控与日志
    第11 章 : 可观测性:你的应用健康吗?(liveness和readiness)
  • 原文地址:https://www.cnblogs.com/luoahong/p/7229683.html
Copyright © 2011-2022 走看看