• 020-python函数和常用模块-文件操作


    Python内置函数open,用来打开在磁盘上的文件,并返回一个文件对象,所有对该文件的后续操作都是通过这个"句柄"来进行的。

    一、文件操作的三个步骤:

    1. 打开文件;
    2. 操作文件;
    3. 关闭文件。

    二、打开文件:

    1 文件句柄 = open('文件路径', '模式')

    打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

    打开文件的基本模式:

    • r ,只读模式【默认】
    • w,只写模式【不可读;不存在则创建;存在则清空内容;】
    • x, 只写模式【不可读;不存在则创建,存在则报错】
    • a, 追加模式【可读;   不存在则创建;存在则只追加内容;】
    1 f = open('db', 'r') # 只读,默认
    2 f = open('db', 'w') # 只写,先清空原文件
    3 f = open('db', 'x') # 文件存在,报错;不存在,创建并只写;python3中才出现的。
    4 f = open('db', 'a') # 追加
    1 f = open("db","r",encoding="utf-8")  # 当文件打开出现乱码时,一般需要关注编码方式
    2 data = f.read()                     # 默认读出为字符串str类型
    3 print(data,type(data))
    4 
    5 #输出
    6 admin|123
    7 222|222 <class 'str'>
    1 f = open("db","a",encoding="utf-8")  
    2 f.write("李杰")
    3 f.close()
     1 f = open('db','rb')    #b表示以字节方式操作,二进制方式读取文件,不用设置编码类型。
     2 data = f.read()
     3 print(data,type(data))
     4 
     5 # 输出为字节类型
     6 b'admin|123
    222|222xe6x9dx8exe6x9dxb0' <class 'bytes'>
     7 
     8 f = open("db", 'ab')    # 以字节方式追加
     9 f.write(bytes("王五", encoding="utf-8"))   # 需要字节类型写入
    10 f.close()
    11 
    12 #文件内容
    13 admin|123
    14 222|222李杰王五
    15 
    16 f = open("db", 'ab')   
    17 f.write("王五")   # 错误示例
    18 f.close()
    19 
    20 #输出
    21 22 TypeError: a bytes-like object is required, not 'str'

    "+" 表示可以同时读写某个文件

    • r+, 读写【可读,可写】,该模式为最常用的模式。
    • w+,写读【可读,可写】,先清除文件内容,然后可以写读操作,不常用。
    • x+ ,写读【可读,可写】,与w+类似,不常用。
    • a+, 写读【可读,可写】,不管指针指向何处,最终都是在文件末尾追加,不常用。

     "b"表示以字节的方式操作

    • rb  或 r+b
    • wb 或 w+b
    • xb 或 w+b
    • ab 或 a+b

     注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

     1 f = open("db","r+",encoding="utf-8")   #读写模式,该模式为最常用的模式
     2 data = f.read()          # 指针移到最后
     3 # print(f.tell())
     4 f.write("大刀")            #在指针后进行数据写入,覆盖模式
     5 f.close()
     6 
     7 #文件内容
     8 admin|123
     9 222|222李杰王五大刀
    10 
    11 
    12 f = open("db","r+",encoding="utf-8")
    13 # 如果打开模式无 b,则read,按照字符读取;有b,则read按照字节读取。
    14 data = f.read(1)
    15 # tell当前指针所在的位置(字节)
    16 print(f.tell())
    17 # 调整当前指针的位置(字节)
    18 f.seek(1)
    19 # 当前指针位置开始向后覆盖
    20 f.write("7777")
    21 f.close()
    22 
    23 #程序输出
    24 3              # f.read(1)按字符读取,第一个字符为“李”,因此当前指针在3的位置
    25 
    26 #文件内容
    27 �7777min|123        # f.seek(1)后,指针位置调整为1,使得“李”这个字符的三个字节被分割,最终导致乱码
    28 222|222李杰王五

    三、操作文件:

    # read() # 无参数,读全部;有参数,
    #                                               open方式有b,按字节
    #                                              open方式无b,按字符
    
    # tell() 获取当前指针位置(字节)
    # seek(1) 指针跳转到指定位置(字节)
    # write() 写数据,open方式有b,字节方式写入; open方式无b,字符方式写入。
    # close
    # flush   强刷
    # truncate 截断,指针为后的清空
    # readline 仅读取一行

     关于flush:

    一般的文件流操作都包含缓冲机制,write方法并不直接将数据写入文件,而是先写入内存中特定的缓冲区。

    flush方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区。

    正常情况下缓冲区满时,操作系统会自动将缓冲数据写入到文件中。

    至于close方法,原理是内部先调用flush方法来刷新缓冲区,再执行关闭操作,这样即使缓冲区数据未满也能保证数据的完整性。

    如果进程意外退出或正常退出时而未执行文件的close方法,缓冲区中的内容将会丢失。

    1 # for循环文件对象 f = open(xxx)
    2 for line in f:
    3     print(line)

    四、关闭文件:

    1 # 方法一:
    2 f.close()
    3 
    4 # 方法二:
    5 with open('xb') as f:
    6     pass

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

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

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

     五:额外

    实现:从文件db1中获取每行信息,并逐行写入到文件db2中,第10行之后自动退出。

    1 with open("db1","r",encoding="utf-8") as r,open("db2","w",encoding="utf-8") as w:
    2     times = 0
    3     for line in r:
    4         times += 1
    5         if times <= 10:
    6             w.write(line)
    7         else:
    8             break

    实现:对每行中包含特定字符串的,进行替换。

     1 with open("db1","r",encoding="utf-8") as r,open("db2","w",encoding="utf-8") as w:
     2     for line in r:
     3         new_line = line.replace("111","vxvx")
     4         w.write(new_line)
     5 
     6 #db1文件
     7 111111
     8 22222
     9 33333
    10 
    11 #db2文件
    12 vxvxvxvx
    13 22222
    14 33333

     http://www.cnblogs.com/wupeiqi/articles/4950799.html

  • 相关阅读:
    什么是em?
    数据结构与算法:快速排序
    flex中flexshrink的理解
    前端的padding是参照父元素的宽度还是高度?
    子元素的border不能通过百分比设置的
    数据库去重的简易方法
    windows2003 iis6.0站点打不开,找不到服务器或 DNS 错误。
    常用WebServices返回数据的4种方法比较
    手机身份证IP地址开放接口(很实用哦)
    从创业失败中学到的七条教训
  • 原文地址:https://www.cnblogs.com/chhphjcpy/p/6083732.html
Copyright © 2020-2023  润新知