zoukankan      html  css  js  c++  java
  • day8___基础(python文件操作)

    一、文件的操作

    文件路径:D: est1.txt (你想操作这个文件,必须要知道这个文件的位置)

    编码方式:utf-8,gbk,gb2312.... (昨天刚讲完编码,文件其实就是数据的存储,数据存储你需要编码知道这个数据是以什么编码存储的)

    操作模式:只读,只写,追加,写读,读写....

    f1 = open('D:\test1.txt', encoding='utf-8', mode='r')
    content = f1.read()
    print(content)
    f1.close()
    

    接下来就是对上面代码的解释:
    f1: 就是一个变量,一般都会将它写成f,f_obj,file,f_handler,fh,等,它被称作文件句柄。
    open:是Python调用的操作系统(windows,linux,等)的功能。
    'd: est1.txt': 这个是文件的路径。
    mode: 就是定义你的操作方式:r为读模式。
    encoding: 不是具体的编码或者解码,他就是声明:此次打开文件使用什么编码本。一般来说:你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8(有些使用的是gbk)。
    f.read():你想操作文件,比如读文件,给文件写内容,等等,都必须通过文件句柄进行操作。
    close(): 关闭文件句柄(可以把文件句柄理解成一个空间,这个空间存在内存中,必须要主动关闭)。

    文件操作三部曲:

    • 打开文件

    • 对文件句柄进行相应操作

    • 关闭文件

    报错原因'

    • 路径问题。

    img

    img

    ​ 这个是没有找到该文件,很可能是你的文件路径错了。

    ​ 路径里面的与后面的字符D此时就不是路径分隔符了,D就有了特殊意义,其实跟 , ,换行符一样

    **解决方式一**: f1 = open('D:\	est1.txt', encoding='utf-8', mode='r')
    

    解决方式二:f1 = open(r'D: est1.txt', encoding='utf-8',)

    解决方式三:f = open('D:/test1.txt',encoding='utf8',mode='r')

    • 编码的问题

      1592986224603

      UnicodeDecodeError 文件存储时与文件打开时的编码本运用不一致

    二、文件读操作

    1) r模式

    以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。
    
    f1 = open('aa.py', encoding='utf=8', mode='r')
    content = f1.read()
    print(content)
    f1.close()
    
    结果:
    详情请看:
    www.tom.com
    高圆圆
    刘亦菲
    张柏芝
    杨紫
    王菲
    
    • read()

    read()将文件中的内容全部读取出来;弊端 如果文件很大就会非常的占用内存,容易导致内存奔溃.

    f1 = open('aa.py', encoding='utf=8', mode='r')
    content = f1.read()
    print(content)
    f1.close()
    
    结果:
    详情请看:
    www.tom.com
    高圆圆
    刘亦菲
    张柏芝
    杨紫
    王菲
    
    • read(n)

      read()读取的时候指定读取到什么位置

    ​ 在r模式下,n按照字符读取。

    f1 = open('aa.py', encoding='utf=8', mode='r')
    content = f1.read(5)
    print(content)
    f1.close()
    结果:
    详情请看:
    
    • readline()

    readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个

    f1 = open('aa.py', encoding='utf=8', mode='r')
    print(f1.readline())
    print(f1.readline())
    print(f1.readline())
    print(f1.readline())
    f1.close()
    
    结果:
    详情请看:
    
    www.tom.com
    
    高圆圆
    
    刘亦菲
    
    

    解决这个问题只需要在我们读取出来的文件后边加一个strip()就OK了

    f1 = open('aa.py', encoding='utf=8', mode='r')
    print(f1.readline().strip())
    print(f1.readline().strip())
    print(f1.readline().strip())
    print(f1.readline().strip())
    print(f1.readline().strip())
    print(f1.readline().strip())
    f1.close()
    结果:
    详情请看:
    www.tom.com
    高圆圆
    刘亦菲
    张柏芝
    杨紫
    
    
    
    • **readlines() **

    readlines()返回一个列表,列表中的每个元素是源文件的每一行,如果文件很大,占内存,容易崩盘。

    f1 = open('aa.py', encoding='utf=8', mode='r')
    print(f1.readlines())
    f1.close()
    结果:
    ['详情请看:
    ', 'www.tom.com
    ', '高圆圆
    ', '刘亦菲
    ', '张柏芝
    ', '杨紫
    ', '王菲']
    
    • for循环

    可以通过for循环去读取,文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存。

    f1 = open('aa.py', encoding='utf=8', mode='r')
    for line in f1:
        print(line)
    f1.close()
    结果:
    详情请看:
    
    www.tom.com
    
    高圆圆
    
    刘亦菲
    
    张柏芝
    
    杨紫
    
    王菲
    
    with open('d:/test1.txt', encoding='utf-8', mode='r') as f1:
        for i in f1:
            print(i.strip())
    f1.close()
    结果:
    详情请看:
    www.tom.com
    高圆圆
    刘亦菲
    张柏芝
    杨紫
    王菲
    

    2)rb模式

    操作的是非文本的文件:图片、视频、音频

    img

    rb模式也有read read(n) readline(),readlines() for循环这几种方法

    with open('timg.jpg', mode='rb') as f1:
        print(f1.read())
    f1.close()
    结果:
    b'xffxd8xffxe0x00x10JFIFx00x01x02x00x00dx00dx00......    
    

    三. 文件操作:写

    1)w模式

    如果文件不存在,利用w模式操作文件,那么它会先创建文件,然后写入内容.

    f = open('test.txt',encoding='utf-8',mode='w')
    f.write('hello world!')
    f.flush() #强制保存
    f.close()
    

    img

    ,利用w模式操作文件,先清空原文件内容,在写入新内容。**

    img

    2)wb

    主要用于非文本文件如:图片,音频,视频等。

    举例说明:

    我先以rb的模式将一个图片的内容以bytes类型全部读取出来,然后在以wb将全部读取出来的数据写入一个新文件,这样我就完成了类似于一个图片复制的流程。具体代码如下:

    timg = open('timg.jpg', mode='rb')
    aa = timg.read()
    timg.close()
    
    timg2 = open('timg2.jpg', mode='wb')
    timg2.write(aa)
    timg2.flush()
    timg2.close()
    

    img

    四. 文件操作:追加

    ​ 追加,就是在文件中追加内容。这里也有四种文件分类主要四种模式:a,ab,a+,a+b,我们只讲a

    • a模式

      ​ 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    如果文件不存在,利用a模式操作文件,那么它会先创建文件,然后写入内容。

    f = open('aa.py',encoding='utf-8',mode='a')
    f.write('
    在后面追加一些内容')  #以字符串的类型写入
    f.close()
    

    img

      如果文件存在,利用a模式操作文件,那么它会在文件的最后面追加内容。

    f = open('aa.py',encoding='utf-8',mode='a')
    f.write('
    在后面追加一些内容')  #以字符串的类型写入
    f.close()
    

    五. 文件操作的其他模式

    • 文件读写

      r+ 读写模式,w+写读模式,a+写读模式,r+b 以bytes类型的读写模式.........

      #1. 打开文件的模式有(默认为文本模式):
      r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
      w,只写模式【不可读;不存在则创建;存在则清空内容】
      a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
      
      #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
      rb  非文本文件只读模式
      wb  非文本文件只写模式
      ab  非文本文件只追加模式
      注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
      
      #3,‘+’模式(就是增加了一个功能)
      r+, 读写【可读,可写】
      w+,写读【可写,可读】
      a+, 写读【可写,可读】
      
      #4,以bytes类型操作的读写,写读,写读模式
      r+b, 读写【可读,可写】
      w+b,写读【可写,可读】
      a+b, 写读【可写,可读】
      

      r+: 打开一个文件用于读写。文件指针默认将会放在文件的开头。

      下面代码示例中,如果aa.py文件里有空格、符号等,再进行读写文件时会报错。

      f = open('aa.py', encoding='utf-8', mode='r+')
      f.write('燕郊')  # 以字符串的类型写入
      conten=f.read()
      print(conten)
      f.close()
      结果:
      燕郊请看:
      中国中国中国中国中国中国中国中国河北河北河北    
      
      f = open('aa.py',encoding='utf-8',mode='r+')
      content=f.read()
      print(content)
      f.write('中国中国')  #以字符串的类型写入
      f.close()
      

      解决方法:

      默认打开文件光标开头, 我们把光标移动最后,再写入相关内容就不会报错

      with open('aa.py',encoding='utf-8',mode='r+') as f1:
          print(f1.seek(0,2))   
          f1.write('美国')
          print(f1.read())
      f1.close()
      

      img

       注意:如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。

    六. 文件操作的其他功能

    tell()

    使用tell()可以帮我们获取当前光标在什么位置

    l1 = open('aa.py',encoding='utf-8',mode='r')
    print(l1.tell())
    l1.read()
    print(l1.tell())
    l1.close()
    结果:
     0
     8   
    

    seek()

    seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数

    通常我们使用seek都是移动到开头或者结尾

    移动到开头:seek(0)

    移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾

    调整光标的位置

    l1 = open('aa.py',encoding='utf-8',mode='r')
    print(l1.seek(2))
    print(l1.read())
    l1.close()
    结果:
     2
    中国
    

    flush()

    强制保存

    f = open('aa.py',encoding='utf-8',mode='r+')
    print(f.read())
    f.write('hello world!++++++')
    f.flush() #强制保存
    f.close()
    

    七. 打开文件的另一种方式

    **with open() as .... **

    # 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
    with open('t1',encoding='utf-8') as f1:
        f1.read()
        
    # 2,一个with 语句可以操作多个文件,产生多个文件句柄。
    with open('t1',encoding='utf-8') as f1,
            open('Test', encoding='utf-8', mode = 'w') as f2:
        f1.read()
        f2.write('中国中国')
    

    优点:不用手动关闭文件句柄,它会在一定时间内自动关闭

    缺点:

    八. 文件的修改

    方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

    import os
    with open('aa.py', encoding='utf-8', mode='r') as f1, 
            open('aa.bak', encoding='utf-8', mode='w') as f2:
        old_content = f1.read()
        new_content = old_content.replace('python', 'linux')
        f2.write(new_content)
    os.remove('aa.py')
    os.rename('aa.bak', 'aa.py')
    
    

    方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

    import os
    
    with open('aa.py', encoding='utf-8', mode='r') as f1, 
            open('aa.bak', encoding='utf-8', mode='w') as f2:
        for line in f1:
            new_line = line.replace('python','linux')
            f2.write(new_line)
    os.remove('aa.py')
    os.rename('aa.bak','aa.py')
    

    半闭文件句柄,再次以w模式打开此文件时才会清空

  • 相关阅读:
    C#学习笔记
    Visual Studio 快捷键
    java 8 中lambda表达式学习
    Spfa算法
    dijkstra算法
    topSort
    并查集--学习详解
    trie树--详解
    POJ1988 并查集的使用
    Mybatis的一级缓存和二级缓存
  • 原文地址:https://www.cnblogs.com/mr-xiong/p/13188009.html
Copyright © 2011-2022 走看看