zoukankan      html  css  js  c++  java
  • DAY8 文件操作

    文件操作

      what and why?为什么需要文件?

      答:通过之前的计算机基础,我们知道,数据如果想要永久保存下去,就需要存储到硬盘中。但是,应用程序是不可以直接操作硬件的,所以需要用到操作系统。操作系统把复杂的硬件操作封装成接口提供给应用程序,文件就是其中用来操作硬盘的虚拟概念。读写文件其实就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从文件中读取数据(读文件),或者把数据写入(写文件)。

      how?如何进行文件操作?

      答:前提需要三要素:

      (1)文件路径

      (2)文件的编码方式

      (3)文件的打开方式:只读,只写,追加,读写...

    打开文件:

    f = open('E:python_training_s1day8\testfile.txt',encoding='utf-8',mode='r')
    content = f.read()
    print(content)
    f.close()
    

      f :本质就是一个普通的变量名,代表文件对象,文件句柄,用来文件操作。

        通常的名为有: f,f_obj,f_handler,f_h,fh...

     open():打开文件,调用的是操作系统的open命令。参数为文件的三要素。

     close():关闭文件,释放内存地址。

    '''
    常见错误:
    (1)unicodedecodeerror:文件存储和打开的编码不一致。
    (2)OSError:有	,
    这种特殊字符,需要用raw str或者\解决
    '''

    读:

     打开方式(mode):r,rb,r+,r+b

     读的五种方法:

     (1)f.read():把文件全部内容一次性读取进内存中。如果文件过大,会撑爆内存。

     (2)f.read(n): 在‘r’模式下,n代表字符;在‘rb’模式下,n代表的是字节。

     (3)f.readline(): 一次读取一行

     (4)f.readlines(): 返回一个列表,文件一行的内容就是列表的一个元素。

     (5)for line in f: 循环句柄,这种方式一次只会在内存开辟一行的空间。推荐。

    #前提:从文件中读进来的内容的数据类型都是字符串str类型
    #文件的内容:我在学习python
           python is elegant '''f.read():一次性把文件的内容都读进内存中。缺点:如果文件过大,会撑爆内存''' f = open('testfile.txt','r',encoding='utf-8') content = f.read() print(content) f.close() >>>'我在学习python' '''f.read(n):在r模式下,n为字符;在rb模式下,n为字节 ''' f = open('testfile.txt',encoding='utf-8',mode='r') content = f.read(3) print(content) f.close() >>>'我在学' f = open('testfile.txt','rb') content = f.read(3) print(content) f.close() >>>b'xe6x88x91' #utf-8编码下,一个汉字为3个字节。 '''f.readline():一次读取一行,缺点:每次读一行需要调用一次readline(),效率低''' f = open('testfile.txt','r',encoding='utf-8') line1 = f.readline() #打印第一行 line2 = f.readline() #打印第二行 print(line1) print(line2) f.close() '''f.readlines():返回一个列表,一行就是列表的一个元素''' f = open('testfile.txt','r',encoding='utf-8') content = f.readlines() print(content) f.close() >>> ['我在学习python ', 'python is elegant'] '''for line in f: 循环文件句柄,每次只会在内存中创建一行''' f = open('testfile.txt','r',encoding='utf-8') for i in f: print(i.strip()) f.close() >>> 我在学习python python is elegant

    写:

     打开方式:w,wb,w+

     f.write(): 如果没有此文件,创建文件并写入;如果文件存在内容,先清空后写入。

    #如果文件不存在,会创建文件。
    f = open('test.txt','w',encoding='utf-8')
    f.write('哈哈哈')
    f.close()
    
    
    # 如果文件存在且有内容,会清空原内容后写入
    f = open('testfile.txt','w',encoding='utf-8')
    f.write('哈哈哈')
    f.close()
    
    # wb : 以二进制的方式写入(bytes类型)
    # f = open('testfile.txt','wb')
    # f.write('呵呵呵'.encode('utf-8'))
    # f.close()

    追加:

      打开方式:a,ab.. 把内容追加到文件的末尾

      f.write()

    f = open('testfile.txt','a',encoding='utf-8')
    f.write('
    python is cool')
    f.close()
    

    读写:

      mode=‘r+’,先读后写(关键在光标的位置)

      一.先读,后追加。不管读多少个字符,光标都置于末尾,在末尾追加内容。

    #文件内容
    '''我在学习python
    python is elegant'''
    
    情景一:f.read()
    f = open('testfile.txt',encoding='utf-8',mode='r+')
    content = f.read()
    print(content)
    f.write('hahaha')
    f.close()
    >>>
    我在学习python 
    python is eleganthahaha            
    
    情景二: f.read(n)
    f = open('testfile.txt','r+',encoding='utf-8')
    content = f.read(6)
    print(content)
    f.write('hahaha')
    f.close()
    >>>
    我在学习py
    

      二.先写,后读。先按照写入的字节长度替换内容,接着把光标后的内容读出来。

    f = open('testfile.txt','r+',encoding='utf-8')
    f.write('hahaha')
    content = f.read()
    print(content)
    f.close()
    >>>
    学习python
    python is eleganthahaha
    

    写读:

      打开方式:w+,先写后读

      先清空后写入,此时光标在最后的位置,再读根本毫无意义。除非结合f.seek()移动光标,再进行读取。

    f = open('testfile.txt','w+',encoding='utf-8')
    f.write('java is good')
    content = f.read()
    print(content)               #此时光标在最后面,content的内容就是行末的换行符
    f.close()
    >>>
    '
    '  
    
    # 先写后读,结合f.seek()移动光标
    f = open('testfile.txt','w+',encoding='utf-8')
    f.write('java is better')
    f.seek(0)                  #f.seek(0)表示把光标移到文件的开头处
    content = f.read()         #此时,content的内容就为新吸入的内容
    print(content)
    f.close()
    >>>
    java is better
    

    追加可读:

        打开方式:a+

       与w+的效果一样,需要结合f.seek()。

    文件操作常用方法:

    (1) f.close() : 关闭文件

    (2) f.read(n) : 默认把文件的所有内容都读取出来;如果有n选项,在r模式下,n代表字符;在rb模式下,n代表字节。

    (3)f.readable() : 文件是否可读,返回True/False

    (4)f.readline() :每次读取文件的一行内容

    (5)f.seek():调整光标的位置,按照字节数调整。f.seek(0):光标跳转到文件开头处。f.seek(0,2):光标跳转到文件末尾处.

    (6)f.tell(): 获取当前光标所在位置,也是按照字节;常与f.seek()一起使用。

    (7)f.truncate():在写模式下,截断数据;按照字节数保留指定之前的数据。

    # 文件内容: python is cool
    f = open('testfile.txt','a',encoding='utf-8')
    f.truncate(2)    #截取保留两个字节
    f.close()
    

    (8)f.write():  文件不存在,创建文件并写入内容;文件存在,清空原有内容后写入。

    (9)f.writeable() : 文件是否可写,返回True/False

    with上下文

      好处:1.主动关闭文件句柄   2.可以同时打开多个文件句柄,对多个文件进行操作

    with open('testfile.txt',encoding='utf-8',mode='r') as f:
        content = f.read()
        print(content)
    
    
    
    #同时打开多个文件句柄
    with open('testfile.txt',encoding='utf-8',mode='r')as f1,
    open('xxx',encoding='utf',mode='w') as f2: pass

      

    文件的修改方法:

    1.以读模式打开原文件,生产一个文件句柄f1

    2.以写模式创建一个新文件,生产一个文件句柄f2

    3.读取原文件内容进行修改,并写入新文件

    4.将原文件删除(os模块的os.remove())

    5.将新文件重命名为原文件(os模块的os.rename())

  • 相关阅读:
    BZOJ3732: Network(Kruskal重构树)
    AtCoder Beginner Contest 103
    2018.7.21NOIP模拟赛?解题报告
    PE刷题记
    杜教筛入门
    浅谈积性函数的线性筛法
    BZOJ4916: 神犇和蒟蒻(杜教筛)
    BZOJ2818: Gcd(莫比乌斯反演)
    LD1-B(最短路径-SPFA)
    UVa 10837 A Research Problem 欧拉函数
  • 原文地址:https://www.cnblogs.com/hebbhao/p/9469347.html
Copyright © 2011-2022 走看看