zoukankan      html  css  js  c++  java
  • Python_008(文件操作)

    一.文件操作

    1.只读操作 

    1 f = open("taibai.txt",mode = "r",encoding = "utf-8"
    2 s = f.read()
    3 f.flush()
    4 f.close()
    5 print(s)
    6 #输出结果:你在taibai.txt文件里的内容

    这里有几个注意点:

    a:第一关于路径的问题:taibai.txt;一般在pycharm外创建的文件都带后缀名,所以关于路径要跟你文件命名一致;

    b:mode是表示想要执行什么操作, encoding:编码格式,一般在文件外创建的文件可能不是utf-8编码的,所以这里要注意;encoding也要根据mode的模式,如果mode是读模式,那enconding就是解码,如果是写,那enconding是编码;在python中mode和encoding默认值是mode = 'r',encoding = 'utf-8';

    c:f.flush()代表刷新, f.close()是关闭句柄f, 这两句话一般要带上;

    关于编码格式这一块:

    encoding表示的是编码集,根据文件的实际保存编码进行获取数据,平常用到的最多的时候utf-8;

    所以引出一种写类型:rb:读取出来的数据是bytes类型,在rb模式下,不用选择encoding字符集,因为你本身

    读出来的就是字节;

    代码展示:

     1 f = open("../ha/hh.txt",mode="rb")
     2 s = f.read()
     3 f.flush()
     4 f.close()
     5 print(s)
     6 s1 = s.decode("GBK")
     7 print(s1)
     8 s1 = s1.encode("utf-8")
      print(s1)
     9 #输出结果: 
    10 b'xc1xf5xb2xa9xcexc4'
    11 刘博文
    12 b'xe5x88x98xe5x8dx9axe6x96x87'

    注意这里不能直接f = open("../ha/hh.txt",mode="r",encoding = "utf-8")这是会报错的,因为通过上面可以看出,我这个文件是

    用"GBK"编码的,所以用rb读取字节,得到GBK编码的字节,然后用s.decode("GBK")解码成万国码,也就是字符串;

    最后用utf-8编码了一遍;得到s1;

    rb的作用:在读取非文本文件的时候,比如在读取MP3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法显

    出来的,在后面我们文件上传下载的时候还会用到,直播也是这种数据;

    2.绝对路径和相对路径的问题

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

    b:相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,则相对路径就是

    这个文件名,如果在上一层,则要../

    3.文件写操作

    a:写模式下,如果没有文件夹,则会自动创建文件,如果文件存在,则将原来的内容全部清空,再写入新内容;

    1 f = open("小护士",mode='w',encoding="utf-8")
    2 f.write("答案似乎是")
    3 f.flush()
    4 f.close()
    5 #输出结果:
    6 创建了一个新文件,
    7 名字为小护士,
    8 内容为:答案似乎是

    注意:在读的状态下不能写,在写的状态下不能读;否则报错;

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

    1 f = open("../ha/hh.txt",mode="wb")
    2 # f.write("答案似乎是".encode("utf-8"))
    3 f.flush()
    4 f.close()
    5 #输出结果:
    6 在外部的文件中,我的文件内容已经改为
    7 答案似乎是 , 而且编码格式为utf-8

    注意:只要是有W的,都是原文件清空,替换成新数据;这跟open有关,open每一次打开,才会清空;

    3.a追加模式

    a:我们写入的内容会追加到文件的结尾,不会清空原来的文件数据;若没有这个文件,也会自动添加;

    1 f = open("../ha/hh.txt",mode="a",encoding="utf-8")
    2 f.write("刘博文是狗")
    3 f.flush()
    4 f.close()
    5 #输出结果:
    6 在文件中追加了一句话,没有清空该文件;

    4.r+只读模式下进行了扩展

    a:先读后写,必须的有这个文件

     1 f = open("小护士",mode="r+",encoding="utf-8")
     2 s = f.read()
     3 f.write("周杰")
     4 f.flush()
     5 f.close()
     6 print(s)
     7 
     8 #输出结果:
     9 答案似乎是
    10 小白
    11 疾风剑豪
    12 诺克萨斯
    13 #因为这里是先读后写,所以后来写入的没有显示出来
    14 但是在小护士的文件中已经添加了

    b:先写后读

    a:在r+模式下,默认情况下光标在文件的开头,所以如果先写后读:

     1 f = open("小护士",mode="r+",encoding="utf-8")
     2 f.write("周润发")
     3 s = f.read()
     4 f.flush()
     5 f.close()
     6 print(s)
     7 #输出结果:
     8 乎是
     9 小白
    10 疾风剑豪
    11 诺克萨斯周杰
    12 #注意这里  答案似乎是 前三个字被周润发覆盖掉了
    13 所以读的时候从光标往后读,就是当前输出结果;

    r+模式下,默认情况下光标在文件的开头,所以会直接覆盖前面的三个文字

    所以保险起见,要先读后写;

    5.w+写读

    先将所有内容清空,然后写入,最后读取,但是光标在最后一位了,读取的内容是空的,不常用;

    1 f = open("小护士",mode="w+",encoding="utf-8")
    2 f.write("周润发")
    3 s = f.read()
    4 f.flush()
    5 f.close()
    6 print(s)
    7 #输出结果:
    8

    如果想要读取内容,先把光标调到开头:

    1 f = open("小护士",mode="w+",encoding="utf-8")
    2 f.write("周润发")
    3 f.seek(0)
    4 s = f.read()
    5 f.flush()
    6 f.close()
    7 print(s)
    8 #输出结果:
    9 周润发

    6.a+

    在a+模式下文件可以写读,如果不改变光标,不管你是先读还是后读,都读取不到内容;因为a代表追加,当你open的时候光标已经移到了最后一位,所以你读不到东西;

    二.文件的一些常用操作

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

    通常我们是使用seek都是移动到开头或者结尾.ctrl + f查找你的东西

    移动到开头:seek(0)

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

    seek讲解:seek(3)的意思,就是先找到3的位置,然后光标移动到那,3个字节代表一个汉字,所以移动到第一个汉字那;

    seek的妙用:

     1 f = open("小护士",mode="r+",encoding="utf-8")
     2 f.seek(6)
     3 s = f.read(3)
     4 print(s)
     5 f.seek(0)
     6 ss = f.read(3)
     7 print(ss)
     8 f.flush()
     9 f.close()
    10 #输出结果:
    11 发小金
    12 周润发

    **注意:在r+模式下有一个深坑,如果读取了内容,就是不管你前面读了几个,光标显示是多少,后面去写都是在末尾;

    如果你不读,直接写,那就会覆盖前面的内容;只有在r+模式下,他不会跟着光标走;

    2.文件的内容修改

     1 import os
     2 with open("小护士",mode="r",encoding="utf-8") as f1, 
     3         open("",mode = "w",encoding="utf-8")as f2:
     4     s = f1.read()
     5     ss = s.replace("","")
     6     f2.write(ss)
     7 os.remove("小护士")
     8 os.rename("","小护士")
     9 #输出结果:
    10 文件中的姓周的:
    11 李润发
    12 李西
    13 李杰伦
    14 李星星
    15 李恩来
    16 李树人
    17 全部变成姓李

    在这里我们要知道文件不能直接修改,必须删掉原来的,在重命名新的文件名称;

    a:readline()表示读取一行;

    所以要想循环读取

     1 with open("小护士",mode="r",encoding="utf-8")as f:
     2     count = 0
     3     for line in f:
           if count >= 2:
    4   print(line) 5 count += 1 6 #输出结果:这里是从第三行开始读取 7 李润发 8 9 李西 10 11 李杰伦 12 13 李星星 14 15 李恩来 16 17 李树人

    用for遍历可以;

  • 相关阅读:
    python opencv PyQt5
    各大web服务器https的证书文件
    mysql 常用字符串操作
    python 修改字符串中的某一位字符
    python mysql
    小程序
    m4a 转MP3
    安装python 3.7
    树莓派版本信息
    bash 重启后台程序脚本
  • 原文地址:https://www.cnblogs.com/0627zhou/p/9295208.html
Copyright © 2011-2022 走看看