• 文件操作


    1.文件操作

      使用python来读写文件是非常简单的的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件家居并就可以进行各种各样的操作了。根据打开方式的不同能够执行的操作也有相应的差异。

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

    2.只读操作(r,rb)

    1 f = open("a.txt",mode = "r",encoding = "utf-8")
    2 content = f.read()
    3 print(content)
    4 f.close()

    encoding表示编码集,更多使用utf-8

      rb读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集

    1 f = open("a.txt",mode = "rb")
    2 content = f.read()
    3 print(content)
    4 f.close

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

    绝对路径和相对路径:

    1.绝对路径:从磁盘根目录开始一直到文件名

    2.相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,则相对路径就是这个文件名,如果在上一层文件夹,则要加../

    推荐使用相对路径,因为在把程序拷贝给别人使用的时候,直接把项目拷贝走就能运行,但是如果使用绝对路径,还需要拷贝外部的文件。

    读取文件的方法:

      read()将文件中的内容全部读取出来,弊端:占内存,如果文件过大,容易导致内存崩溃

    1 f = open("a.txt",mode = "r",encoding = "utf-8")
    2 content = f.read()
    3 print(content)

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

      

    1 f = open("a.txt",mode = "r",encoding = "utf-8")
    2 content1 = f.read(3)
    3 content2 = f.read(3)
    4 print(content1)
    5 print(content2)

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

     1 f = open("a.txt",mode = "r",encoding="utf-8")
     2 content1 = f.readline()
     3 content2 = f.readline()
     4 content3 = f.readline()
     5 content4 = f.readline()
     6 print(content1)
     7 print(content2)
     8 print(content3)
     9 print(content4)
    10 f.close

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

    1 f = open("a.txt",mode = "r",encoding = "utf-8")
    2 lst = f.readlines()
    3 print(lst)
    4 for line in lst:
    5     print(line.strip())

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

      

    1 f = open("a.txt",mode = "r",encoding = "utf-8")
    2 for line in f:
    3     print(line.strip())

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

    3.写模式(w,wb)

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

      

    1 f = open("a.txt",mode = "w",encoding="utf-8")
    2 f.write("123")
    3 f.flush()
    4 f,close()

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

    4.追加(a,ab)

    在追加模式下,写入的内容会追加在文件的结尾

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

      对于读写模式,必须是先读,因为默认光标是在开头准备读取的,当读完了之后再进行写入

      

    1 f = open("a.txt",mode = "r+",encoding = "utf-8")
    2 cotent = f.read()
    3 f.write("123")
    4 print(content)
    5 f.flush()
    6 f.close()

      必须在读取之后再写

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

      先将所有内容清空,然后写入,最后读取,但是读取的内容是空的,不常用

    7.追加读(a+)

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

    8.其他相关操作

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

        移动到开头:seek(0)

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

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

      3.truncate()  截断文件 

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

        如果想做截断操作,要先挪动光标到想截断的位置,然后再进行截断

        如果truncate(n) 给出了n,则从开头进行截断,如果不给n,则从当前位置截断,后面的内容将会被删除

      4.  修改文件以及另一种打开文件的方式

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

        

    1 import os
    2 
    3 with open("a.txt",mode = "r",encoding = "utf-8") as f1,
    4     open("a1.txt",mode = "w",encoding = "utf-8") as f2:
    5     content = f1.read()
    6     content1 = content1.replace("456","123")
    7     f2.write(content1)
    8 os.remove("a.txt")
    9 os.rename("a1.txt","a.txt")

    一次将所有的内存读取,内存溢出

    解决方案:一行一行的读取和操作

  • 相关阅读:
    BZOJ 2120 数颜色
    BZOJ 3289 Mato的文件管理
    BZOJ 2038 小Z的袜子
    BZOJ 1878 HH的项链
    洛谷P2709 小B的询问
    6491: Daydream
    问题 L: An Invisible Hand
    HDU-2177 取(2堆)石子游戏 (威佐夫博奕)
    (POJ-3279)Fliptile (dfs经典---也可以枚举)
    问题 J: Palindromic Password ( 2018组队训练赛第十五场) (简单模拟)
  • 原文地址:https://www.cnblogs.com/s593941/p/9436555.html
Copyright © 2020-2023  润新知