zoukankan      html  css  js  c++  java
  • python之文件处理

    一.文件操作介绍:

      文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或用程序通过操作文件,可以将自己的数据永久的保存下来.

    操作文件的流程:

    #1.打开文件,的到文件句柄并赋值给一个变量
    f=open("a.txt",mode="r",encoding="utf-8") #默认打开方式是r #2.通过句柄对文件进行操作
    data=f.read() #3.关闭文件
    f.close()

    打开的方式有:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b,默认使用的是r(只读)模式

    二.打开文件的模式与操作文件的方法

    打开文件的模式
    #
    1. 打开文件的模式有(默认为文本模式): r , 只读模式[默认模式.文件必须存在,不存在则抛出异常] w , 只写模式[不可读;不存在则创建;存在则清空内容] a , 只追加模式[不可读;不存在则创建;存在则之追加内容] #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码/图片文件jpg格式/视频文件的avi格式) rb wb ab 注意:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 #3 了解 "+" 表示可以同时读写某个文件 r+ , 读写[可读,可写] w+ , 写读[可读,可写] x , 只写模式[不可读;不存在则创建,存在则报错] x+ , 写读[可读,可写] xb
    操作文件的方法
    
    #1.需要重点掌握:
    f.read()  #读取所有内容,光标移动到文件末尾
    f.readline()   #读取一行内容,光标移动到第二行首部
    f.readlines()   #读取每一行内容,存放于列表中
    f.write('1111
    222
    ') #针对文本模式的写,需要自己写换行符
    f.write('1111
    222
    '.encode('utf-8')) #针对b模式的写,需要自己写换行符
    f.writelines(['333
    ','444
    ']) #文件模式
    f.writelines([bytes('333
    ',encoding='utf-8'),'444
    '.encode('utf-8')]) #b模式
    
    #了解
    f.readable() #文件是否可读
    f.writable() #文件是否可读
    f.closed #文件是否关闭
    f.encoding #如果文件打开模式为b,则没有该属性
    f.flush() #立刻将文件内容从内存刷到硬盘
    f.name

    三.操作方法例题掌握

    (一).只读操作(r,rb)

    f = open("juan.txt",mode="r",encoding = "utf-8")
    content = f.read()
    print(content)
    f.close

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

       

       rb读取出来的数据bytes类型,在rb模式下,不能选择encoding字符集,具体事例如下:

      f = open("你好.txt",mode="rb")
        content = f.read()
        print(content)
        f.close()
        结果为:
        b'hello world
    xe7xaax97xe5x89x8dxe6x98x8exe6x9cx88xe5x85x89
    
    '

        rb 的作用:在读取非文本文件的时候,比如读取MP3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到,还有我们看的直播,实际山都是这种数据.

    相对路径和绝对路径:

       1.绝对路径:从磁盘目录开始一直到文件名 或者 从互联网上寻找一个路径

       2.相对路径:相对于当前程序所在的文件夹  ../指的是上一层文件夹

    注意:使用相对路径较好,因为在我们把程序拷贝给别人使用的时候,直接把项目拷贝就能运行,但是如果用绝对路径,那还需要拷贝外部的文件.

    读取文件的方法:read(),read(n),readline(),readines(),还有for循环读取.

    1.read()将文件中的内容全部都取出来,缺点:占内存,如果文件过大,容易导致内存崩溃.

            f = open("juan.txt",mode="r",encoding="utf-8")
            content = f.rend()
            print(content)
            f.close()

    2.read(n)读取n个字符,需要注意的是:如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式.则读取出来的是n个字节.实例

    
    
      f = open("你好.txt",mode="r",encoding="utf-8")
        content = f.read(3)   #读取出来3个字符
        print(content)  
        f.close()
    
        f = open("你好.txt",mode="rb")
        content = f.read(3)   # 读取出来3个字节
        print(content)
        f.close()
    
        f = open("你好.txt",mode="r",encoding='utf-8')
        content1 = f.read(3)   # 读取出来3个字符
        content2 = f.read(3)   # 接着刚才的位置再读取3个字符
        print(content1)
        print(content2)
        f.close()

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

        f = open("你好.txt",mode="r",encoding='utf-8')
        content1 = f.readline()
        content2 = f.readline()
        content3 = f.readline()
        print(content1)
        print(content2)
        print(content3)
        f.close()

    4,readlines( )将每一行形成一个元素,放到一个列表中,然后将所有的内容都读取出来,所以,同理,也容易出现内存崩溃的问题,不推荐使用。具体如下示例:

      f = open("你好.txt",mode="r",encoding='utf-8')
        lst = f.readlines()
        print(lst)
        for line in lst:
            print(line.strip())
        f.close()

    5,循环读取,这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题。具体如下示例:

        f = open("你好.txt",mode="r",encoding="utf-8")
        for line in f:
            print(line.strip())

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

    (二)、写模式(w,wb)

    读的时候,如果所读取的文件不存在,则会报错;

    写的时候注意,如果没有文件,则会创建文件,如果文件存在,则将文件中原来的内容删除,再写入新内容;

    f = open("小娃娃",mode="w",encoding="utf-8")
        f.write()
        f.flush()   # 刷新,要养成好习惯
        f.close()

    尝试读一读:

    f = open("你好",mode="w",encoding="utf-8")
        f.write("hello world")
        f.read()  # 报错:not readable ,因为模式是w. 不可以执行读操作
        f.flush()
        f.close()

    wb模式下,可以不指定打开文件的编码,但是在写文件的时候必须将字符串转化成utf-8的bytes数据。如下:

    f = open("你好.txt",mode="wb")
        f.write("你是谁?".encode("utf-8"))
        f.flush()
        f.close()

    (三),追加(a,ab)

    在追加模式下,我们写入的内容会追加在文件的结尾(默认不换行,换行需要手动控制,即 ),具体如下示例:

       f = open("你好.txt",mode="a",encoding="utf-8")
        f.write("你的最爱")
        f.flush()
        f.close()

    (四),读写模式(r+,r+b)

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

    正确的操作是:

       f = open("你好.txt",mode="r+",encoding="utf-8")
        content = f.read()
        f.write("你的最爱?")
        print(content)
        f.flush()
        f.close()
        # 结果:正常的读取之后,写在结尾

    错误的操作:

     f = open("你好.txt",mode="r+",encoding="utf-8")
        f.write("你的最爱")
        content = f.read()
        print(content)
        f.flush()
        f.close()
        # 结果:将开头的内容改写成了“我的最爱”,然后读取的是后面的内容

    综上,所以记住:在r+模式下,必须是先读取,然后再写入。

    深坑请注意:在r+模式下,如果读取了内容,不论读取内容多少,光标显示的是多少,再写入或者操作文件的时候都是在结尾进行的操作。

    (五),写读(w+,w+b)

    先将所有的内容清空,然后写入,最后读取,但是读取的内容是空的,不常用。具体操作如下示例:

    f = open("你好.txt",mode="w+",encoding="utf-8")
        f.write("哈哈")
        content = f.read()
        print(content)
        f.flush()
        f.close()

      有人会说,先读不就好了么?错,在w+模式下,一开始读取不到数据,然后写的时候再将原来的内容清空,所以,很少用。

    (六),追加读(a+)

    a+模式下,不论先读还是后读,都是读取不到数据的。

        f = open("你好.txt",mode="a+",encoding="utf-8")
        f.write("麻花藤")
        content = f.read()
        print(content)
        f.flush()
        f.close()

    还有一些其他的带b的操作,在此就不一一举例了,就是把字符换成字节,仅此而已。

    (七),其他相关操作:seek(n),tell( ),truncate( )

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

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

           移动到开头:seek(0)

           移动到结尾:seek(0,2)

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

    f = open("你好.txt",mode="r+",encoding="utf-8")
        f.seek(0)  # 光标移动到开头
        content = f.read()  # 读取内容,此时光标移动到结尾
        print(content)
        f.seek(0)  # 再次将光标移动到开头
        f.seek(0,2)  #将光标移动到结尾
        content2 = f.read()   # 读取内容,什么都读不到
        print(content2)
    
        f.seek(0)  # 光标移动到开头
        f.write("张国荣")  # 写入信息,此时光标在9,即中文3 bytes * 3个 = 9
    
        f.flush()
        f.close()

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

     f = open("你好.txt",mode="r+",encoding="utf-8")
        f.seek(0)  # 光标移动到开头
        content = f.read()  # 读取内容,此时光标移动到结尾
        print(content)
        f.seek(0)  # 再次将光标移动到开头
        f.seek(0,2)  #将光标移动到结尾
        content2 = f.read()   # 读取内容,什么都读不到
        print(content2)
    
        f.seek(0)  # 光标移动到开头
        f.write("张国荣")  # 写入信息,此时光标在9,即中文3 bytes * 3个 = 9
    
        print(f.tell())  # 结果为:9   即光标位置是 9
    
        f.flush()
        f.close()

    3 truncate( ),截断文件

    f = open("你好.txt",mode="w",encoding="utf-8")
        f.write("哈哈")  # 写入3个字符
        f.seek(3)  # 光标移动到3,也就是两个字中间
        f.truncate()  # 删掉光标后面的所有内容
        f.close()
        
        f = open("你好.txt",mode="r+",encoding="utf-8")
        content = f.read(3)  # 读取12个字符
        f.seek(6)  # 光标从开始向右移动2个字符
        print(f.tell())
        f.truncate()  # 后面的所有内容全部都删掉
        print(content)
        f.flush()
        f.close()

     所以如果想做截断操作,记住了,要先挪动光标,挪动到你想要截断的位置,然后再进行截断,关于truncate(n),如果给出了n,则从开头开始进行截断,如果不给n,则从当前位置截断, 后面的内容将会被删除。

    (八),修改文件以及另一种打开文件的方式

           文件修改:只能将文件中的内容读取到内存中,将信息修改完毕,然后将原文件删除,将新的文件的名字改成老文件的名字。

       # 文件修改
        import os
        with open("你好.txt",mode="r",encoding="utf-8") as f1,
            open("你好_new.txt",mode="w",encoding="utf-8") as f2:
            content = f1.read()
            new_content = content.replace("冰糖葫芦","大白梨")
            f2.write(new_content)
        os.remove("你好.txt")  # 删除原文件
        os.rename("你好_new.txt","你好.txt")   # 重命名新文件

    弊端:一次将所有内容进行读取,内存溢出。解决方案:一行一行的读取和操作。具体操作如下示例:

     import os
        with open("你好.txt",mode="r",encoding="utf-8") as f1,
            open("你好_new.txt",mode="w",encoding="utf-8") as f2:
            for line in f1:
                new_line = line.replace("冰糖葫芦","大白梨")
                f2.write(new_line)
        os.remove("你好.txt")  # 删除原文件
        os.rename("你好_new.txt","你好.txt")   # 重命名新文件
  • 相关阅读:
    JS 逻辑运算符&&与||的运算
    Jquery on("click") 方法绑定事件后执行多次解决办法
    java的web开发使用struts2/springMVC和spring框架理解
    HTTPClient
    eclipse中配置tomcat内存大小
    杀掉window占用端口
    Unirest
    乐观锁
    自定义标签
    xss和csrf攻击
  • 原文地址:https://www.cnblogs.com/wxj1129549016/p/9439063.html
Copyright © 2011-2022 走看看