zoukankan      html  css  js  c++  java
  • day8.python文件操作

    打开和关闭文件

    open函数

    用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。

    file = open(file_name [, access_mode][, buffering])

    不同模式打开文件的列表:

    t:     文本模式(默认)
    r:     以只读模式打开文件,指针将放在文件开头
    r+:    打开一个文件用来读写,指针在开头
    rb:    以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    rb+   以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w:   打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    w+:   打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb:   以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    wb+: 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a:   打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+:   打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab:   以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab+: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    1.只读操作:(r,rb)

    对于r:需要注意encoding表示编码集。根据文件的实际保存编码进行获取数据,对于我们而言,更多的是utf-8

    r = open('文件测试',mode = 'r',encoding='utf-8')
    content = f.read()
    print(content)
    f.close()

    对于rb: 读取出来的数据是Bytes类型,在rb模式下,不能选择encoding字符集。在读取非文本文件的时候。比如读取MP3、图像、视频等信息的时候就需要用到rb。因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到。还有我们看的直播。实际上都是这种数据。

    rb = open('文件测试',mode='rb')
    content = rb.read()
    print(content )
    rb.close() 
    
    b'xe8xa9xb9xe5xa7x86xe6x96xafxefxbcx8cxe5x93x88xe7x99xbbxefxbcx8cxe4xbfx9dxe7xbdx97'

    2.写模式 (w,wb)

    若文件不存在则创建文件,若存在则会覆盖文件,慎用。

    w = open('文件操作',mode='w',encoding='utf-8')
    w.write('测试一下')
    w.close()

    写模式下读文件

    w = open('文件操作',mode='w',encoding='utf-8')
    w.write('测试一下')
    count = w.read()
    print(count)
    w.close()
    io.UnsupportedOperation: not readable

    二进制写:wb模式下以二进制打开一个文件用于写,不需要指定编码方式。在写入文件的时候需要指定编码方式,否则会报错

    w = open('文件操作',mode='wb')
    w.write('测试一下下'.encode('utf-8'))
    w.close()

    3.追加 (a,ab)

    追加模式下,文件会追加在文件末尾。

    a = open('文件测试',mode='a',encoding='utf-8')
    a.write('hello,world')
    a.close()
    
    # ab二进制追加
    ab = open('文件测试',mode='ab')
    ab.write('梦三国'.encode('utf-8'))
    ab.close() 

    4.读写模式(r+,r+b)

    对于读写模式,必须是先读。因为默认光标是在开头的,准备读取的。当读完了之后再进行写入,我们以后使用频率最高的模式就是r+

    r = open('文件操作',mode='r+',encoding='utf-8')
    count = r.read()
    print(count)
    r.write('NBA')
    r.flush()  #刷新缓冲区    
    r.close()

    错误操作:

    若我们先写后读的话,写进去的内容会将文件里面的前N个字符占用取代

    r = open('文件操作',mode='r+',encoding='utf-8')
    r.write('NBA')
    count=r.read()
    print(count)
    r.close()
    NBAlo,world

    5.写读模式(w+,w+b)

    写读模式会将文件内容清空,再读取。但是读取到的内容为空,说明指针到了最后

    r = open('文件操作',mode='w+',encoding='utf-8')
    r.write('这是一个安静的晚上')
    print(r.read())
    r.close()

    #指针验证
    r = open('文件操作',mode='w+',encoding='utf-8')
    r.write('这是一个安静的晚上')
    r.seek(0)
    print(r.read())
    r.close()
    这是一个安静的晚上

    6.追加读(a+)

    f = open('log',mode='a+',encoding='utf-8')
    f.write('佳琪')
    f.seek(0)
    print(f.read())
    f.close()

    7.补充内容

    read()  将文件全部读出来,容易引起内存崩塌

    1.read (n)

    在 r 模式下,读取前3个字符,无论中文英文都一样。如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,则读取出来的是n个字节。

    file = open('文件操作',mode='r',encoding='utf-8' )
    count = file.read(3) 
    print(count)
    file.close()
    abc(爱死你)

    file = open('文件操作',mode='rb' )
    count = file.read(3)
    print(count)
    file.close()
    b'xe7x88xb1'
    
    
    file = open('文件操作',mode='r' ,encoding='utf-8' )
    count1 = file.read(3)
    count2 = file.read(3)
    print(count1)
    print(count2)
    file.close()

      爱是你
      abc

     2.readline()

    一次读取一行数据,注意: readline()结尾,注意每次读取出来的数据都会有一个 。所以,需要我们使用strip()方法来去掉 或者空格。

    f = open("2018-11-28/heart",mode="r",encoding="utf-8")
    content1 = f.readline()
    content2 = f.readline()
    print(content1)
    print(content2)
    
    爱我记得走心
    
    可乐记得加冰

    3.readlines

    将每一行形成一个元素,放到一个列表中,将所有的内容都读取出来,所以也是,容易出现内存崩溃的问题,不推荐使用。

    f = open("2018-11-28/heart",mode="r",encoding="utf-8")
    lst = f.readlines()
    print(lst)
    for line in lst:
        print(line.strip())
    
    ['爱我记得走心
    ', '可乐记得加冰
    ']
    爱我记得走心
    可乐记得加冰

    4.循环读取

    这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题

    f = open("2018-11-28/heart",mode="r",encoding="utf-8")
    for i in f:
        print(i.strip())

    ***注意: 读取完的文件句柄一定要关闭f.close()

    5.seek(n)

    光标移动到n位置,注意,移动的单位是byte,所以如果是UTF-8的中文部分要是3的倍数。
    通常我们使用seek都是移动到开头或者结尾

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

    file = open('文件操作',mode='r+' ,encoding='utf-8' )
    
    file.seek(0) #光标移动到开头
    content = file.read() # 此时读完以后光标在结尾
    print(content )
    
    file.seek(0) # 光标移动到开头
    file.seek(0,2) # 光标移动到结尾
    content2 = file.read() # 读出来是空
    print(content2 )
    
    file.seek(0)     
    file.write('测试') # 光标移动到开头,写入‘测试’ 占用前两个字符
    
    file.flush()
    file.close()

    6.tell () 光标位置

    file = open('文件操作',mode='r+' ,encoding='utf-8' )
    
    file.seek(0)
    print(file.tell())
    
    content = file.read()
    print(file.tell())
    print(content )
    
    file.flush()
    file.close()
    
    0
    17
    一二三四五

     8.修改文件内容

    思路:python文件操作不可直接对文件进行操作,逐行读取修改,并写入新文件。删除旧文件,重命名新文件

    with open('小护士班主任',mode= 'r',encoding= 'utf-8') as f1,open('小护士班主任.bak',mode='w',encoding= 'utf-8') as f2:
        for line in f1:
            if '星儿' in line:
                line = line.replace('星儿','阿娇')
            f2.write(line)
    
    import os
    os.remove('小护士班主任')
    os.rename('小护士班主任.bak','小护士班主任')
  • 相关阅读:
    Token ,Cookie和Session的区别
    极致Web性能 —— SPA性能指南
    关于前端数据&逻辑的思考
    移动端Retina屏boder 1px显示为2px或3px的解决方法
    Java连载8-基本数据类型2
    HTML连载25-通配符选择器&选择器综合练习
    Python连载25-函数tell&write&writeline$&持久化
    Python连载24-函数list&read&seek
    Java连载7-变量&数据类型
    HTML连载24-属性选择器(下)
  • 原文地址:https://www.cnblogs.com/jiuyachun/p/10335590.html
Copyright © 2011-2022 走看看