• 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())

  • 相关阅读:
    LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
    UVA 10564 Paths through the Hourglass(背包)
    Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
    UVALive 3530 Martian Mining(贪心,dp)
    UVALive 4727 Jump(约瑟夫环,递推)
    UVALive 4731 Cellular Network(贪心,dp)
    UVA Mega Man's Mission(状压dp)
    Aizu 2456 Usoperanto (贪心)
    UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
    Aizu 2304 Reverse Roads(无向流)
  • 原文地址:https://www.cnblogs.com/hebbhao/p/9469347.html
Copyright © 2020-2023  润新知