zoukankan      html  css  js  c++  java
  • 【python】-- 文件操作

    一、概述

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

    1、文件操作的流程:

    • 打开文件,得到文件句柄赋值给一个变量
    • 通过文件句柄,对文件进行操作
    • 关闭文件
      #获取文件句柄
      f = open("yesterday","r",encoding="utf-8")
      #读取数据
      data = f.read()
      #打印读取的文件
      print(data)
      #关闭文件
      f.close()

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

    2、两次读取,第二次读取无内容解疑:

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

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

    读取内容:

    Somehow, it seems the love I knew was always the most destructive kind
    
    Yesterday when I was young
    View Code
    f = 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---------
    View Code

    二、文件打开模式:

    1、打开文件的模式有:

      注:在读取文件之前最好导入os模块,判断一下文件是否存在,这是一个好习惯

    filename = r"C:UsersdellPycharmProjectsuntitledhome_workweek4haproxy"
    if os.path.exists(filename):
        #再进行获取文件句柄操作
    View Code
    • r,英文:read,只读模式(默认)
    • w,英文:write,只写模式(不可读,不存在则创建新文件,存在则删除内容)
    • a,英文:append,追加模式(不可读,不存在则创建,存在则只追加内容)
    f = open("yesterday","r",encoding="utf-8")
    data = f.read()
    print(date)
    f.close()
    #注:读操作,只能是只读,不能写和追加
    
    #############################
    
    f = open("yesterday2","w",encoding="utf-8")
    f.write("qqqqqq")
    f.close()
    #注:写操作只能写和追加,不能读,而且写操作:
    1、文件不存在,会重新创建一个文件,
    2、文件存在,会覆盖之前的文件中的内容
    
    #############################
    
    f = open("yesterday2","a",encoding="utf-8")
    f.read("aaaaaaaaaaaa")
    f.close()
    #注:追加模式不可读,不存在则创建,存在则只追加内容
    View Code

    2、"+"号表示同时读写某个文件:

    • r+,可读写文件(可读;可写;可追加)          
    • w+,可写读文件(可读,可写,创建新文件)
    • a+,可追加和读文件(可读,可追加,不存在则创建)
    f = open("yesterday","r+",encoding="utf-8")
    f.write("
    666666")
    print(f.read())
    f.close()
     
    #输出
    Somehow, it seems the love I knew was always the most destructive kind
    Yesterday when I was young
    666666
    
    #########################################
    
    写读的功能是:创建新文件->写入文本->设置指针为开始位置(seek(0))->读取到文件内容
    
    f = open("yesterday2","w+",encoding="utf-8")
    print(f.read())
    f.write("qigao zui lang
    ")
    f.seek(0)
    print(f.read())
    print(f.tell())
    f.write("qigao zui lang
    ")
    f.seek(0)
    print(f.read())
     
    #输出
    #第1次读的内容
     
    #第二次读取的内容
    qigao zui lang
     
    #指针位置
    16
    #第三次读取的内容
    qigao zui lang
    qigao zui lang
    
    #######################################
    
    追加和读:追加读在写入文件时,不会清空之前的内容,而是在之前的内容的追加一行,读取文件内容,需要重新设置指针
    
    f = open("yesterday2","a+",encoding="utf-8")
    print("--------data1-----")
    print(f.read())  #没有设置指针
    print("--------data2-----")
    f.seek(0)
    print(f.read()) #设置指针
    f.write("qigao zui lang
    ")
    print("---------data3----")
    print(f.read())  #写完以后没有设置指针
    print("--------data4-----")
    f.seek(0)
    print(f.read()) #写完以后设置指针
    f.close()
     
    #输出
     
    --------data1-----
     
    --------data2-----
    And only now I'm left alone to end the play, yeah
    qigao zui lang
    qigao zui lang
     
    ---------data3----
     
    --------data4-----
    And only now I'm left alone to end the play, yeah
    qigao zui lang
    qigao zui lang
    qigao zui lang
    View Code

     注:

    1、写读和追加功能,写入的行数不会收指针位置的控制,就是说不管指针在什么位置,依然写入的还是最后一行。

    2、就是说当你,需要从开始读取文件内容的话,或者在某个位置之后的内容的话,需要设置指针位置,否则读取不到内容,代码如下:

    f = open("yesterday2","w+",encoding="utf-8")
    f.write("qigao zui lang
    ")
    print("-----不设指针位置-----")
    print(f.read())
    f.write("qigao zui lang
    ")
    print("-----设置指针位置-------")
    f.seek(0)
    print(f.read())
     
    #输出
    -----不设指针位置-----
     
    -----设置指针位置-------
    qigao zui lang
    qigao zui lang
    View Code

    "U"表示在读取文件时,可以把 自动转化为 (与 r 或 r+ 模式同使用)

    • rU
    • r+U

    3、"b"表示处理二进制文件

    • rb 二进制读
    • wb 二进制写
    • ab 二进制追加

    这种是以二进制操作的,也就是说不管是是读,写,追加,都必须是二进制文件,也就是字节,而不是字符,需要解码以后才会生成字符。一般情况下跨平台的文件,视频文件等需要二进制模式 操作

    #rb(二进制读)
    
    #二进制读取
    f = open("yesterday2","rb")
    f_read = f.read()
    print(f_read)
    #解码
    print(f_read.decode())
     
    #输出
    #没有解码,读出来的是二进制,也就是字节码
    b'Somehow, it seems the love I knew was always the most destructive kind'
    #解码后,是字符
    Somehow, it seems the love I knew was always the most destructive kind
    
    #####################################
    
    
    # wb(二进制写)
    
    f = open("yesterday2","wb")
    in_str = "小高最帅"
     
    #这边写入文件,就需要编码,否则就会报错
    in_str = in_str.encode()
     
    f.write(in_str)
    f.close()
    
    ####################################
    
    
    # ab(二进制追加)
    
    f = open("yesterday2","ab")
    in_str = "gaoge,shuai de yibi"
    #这边需要先编码,才能追加到文件中
    in_str = in_str.encode()
     
    f.write(in_str)
    f.close()
    View Code

    注:普通打开模式和二进制打开模式,只是在python 3中,二进制打开模式才做了字符和字节的编码和解码;然而在python 2中,字节和字符没有做明显的区别,所以在python 2中,二进制模式读取文件时,不需要做编码和转码的操作

    三、with、读取文件对比:

    1、with:

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

    with open('log','r') as f:
        pass

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

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

    2、读取文件对比:

    readline()

    读取一行文件

    f = 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()

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

    f = 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
    ']

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

    f = open("yesterday2","r",encoding="utf-8")
    for line in f.readlines():
        print(line.strip())
    f.close()
    #输出
    Somehow, it seems the love I knew was always the most destructive kind
    Yesterday when I was young

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

    f = open("yesterday2",'r',encoding='utf-8')
    #f文件变成迭代器
        for line in f:
            print(line.strip())
      f.close()
    #输出结果
    Somehow, it seems the love I knew was always the most destructive kind
    Yesterday when I was young

    这种写法的好处在于,读取文件时,是一行一行的读取,而且,读取一行删除一行,内存中只保留一行

    四、文件操作的内置方法:

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

  • 相关阅读:
    string::push_back()
    string::pop_back
    string::insert
    string::get_allocator
    opencv —— minEnclosingCircle、fitEllipse 寻找包裹轮廓的最小圆、点集拟合椭圆
    opencv —— boundingRect、minAreaRect 寻找包裹轮廓的最小正矩形、最小斜矩形
    opencv —— approxPolyDP 生成逼近曲线
    opencv —— convexHull 寻找并绘制凸包
    opencv —— findContours、drawContours 寻找并绘制轮廓
    opencv —— equalizeHist 直方图均衡化实现对比度增强
  • 原文地址:https://www.cnblogs.com/Keep-Ambition/p/7193752.html
Copyright © 2011-2022 走看看