python文件操作

python文件操作

文件格式:

  打开一个文件,必要的文件的参数:
  1. 文件路径
  2. 文件编码格式
  3. 打开方式mode:(读、写、读写、写读、追加、改。。。)

    列:
      # f1 = open('log1', encoding='gbk', mode='r') #打开文件
      # print(f1.read()) #读取文件
      # f1.close() #关闭文件

  列子中f1 叫文件句柄,可以叫f,file,file_hander,f_h。。。只要是以f开头都有可能是文件句柄。
  Open() 是调用的内置函数,实际是内置汉中调用的windos里面,windos系统的内部的open使用,在windows下是gbk,在linux下是utf-8。
  一切对文件进行的操作都是基于文件句柄F1

执行流程:

  打开文件并产生文件句柄 —-> 对文件句柄进行操作 ——> 关闭文件句柄

  注意:
    1.当时是用什么编码写的用什么编码打开
    2.在路径层级教多时候有些会被默认特殊处理,所以路径写错会经常报错。
      解决办法:
        在路径前面加r,表示这个路径仅表示路径,不表示其他
        在歧义路径前在多加一个斜杠去除转义
        路径分为绝对路径和相对路径需要注意

文件的读、写、追加:

  文件的常用操作分为读取,写入,和追加,r/w/a

  文件的读(r):
    读模式分为r 、rb、r+、r+b

    r模式:


    rb模式:
      带b操作的都是非文字的文件(比如图片视频等)。以byte类型读取,默认自己定义读取方式了
      read(n)读出一部分,n等于几就读出几个字节

    r+模式:
      先读后写

    r+b模式:
      先度后写处理非文字类的文件

    (r)模式下面的读取方式:

      read()
        全部读出来

      read(n)
        读出一部分,n等于几就读出几个字符。

      .readline()按行读取
        默认读取一行,写一行读一行,空行也读取。

      .readlines()
        全部读出,并放在一个列表中,列表中每一个元素就是一行内容

      .for循环读取文件句柄,
        其中里面的f1,是被迭代查询出来的,也是按行读取,查出来一条然后释放一条,在继续查询,每次只占一条,最大限度减少内存压力


          (R)读取模式举例:

              # 1 read() 全读出来
              # f1 = open('log1', encoding='utf-8')
              # content = f1.read()
              # print(content)
              # f1.close()

              #2 read(n) 读一部分 #默认是r模式
              # f1 = open('log1', encoding='utf-8')
              # content = f1.read(3)
              # print(content)
              # f1.close()

              # f1 = open('log1', mode='rb')
              # print(f1.read(3).decode('utf-8'))
              # f1.close()
              #r 模式 read(n) n 按照字符读取。
              #rb 模式 read(n) n 按照字节读取。


              # #3 readline() 按行读取
              # f1 = open('log1', encoding='utf-8')
              # print(f1.readline())
              # print(f1.readline())
              # print(f1.readline())
              # f1.close()

 #4 readlines()
 # f1 = open('log1', encoding='utf-8')
 # print(f1.readlines())
 # f1.close()

 # 5 for 循环
 # f1 = open('log1', encoding='utf-8')
 # for line in f1:
 # print(line)
 # f1.close()


 # f1 = open('1.jpg', mode='rb')
 # print(f1.read())
 # f1.close()

文件的写:(w)

  W模式下如果没有文件,会自动创建文件进行写入
  写入前如果文件存在,是先清空再写入新内容。
  在写模式下要注意调整光标,如果在写入完成后,指针会在最后一位,再继续读的时候,后面没有任何内容,需要调整光标到初始位置然后读取内容。
  seek()——指针调整光标到0
  seek(n)——将指针任意调整到某个n的位置
  seek(0,2)——指针调整到末尾


  写模式分为w wb w+ w+b

  w模式:

  wb模式:
    处理非文字的文件

  w+模式:
    先写后读

  w+b模式:
    先写后读,处理非文字类文件


      举例:
        # f1 = open('log2', encoding='utf-8', mode='w')
        # f1.write('桃白白fdksagdfsa')
        # f1.close()

        # 图片的读取及写入
        # f1 = open('1.jpg', mode='rb')
        # content = f1.read()

        # f2 = open('2.jpg', mode='wb')
        # f2.write(content)
        # f1.close()
        # f2.close()

        # w+ 先写后读
        # f1 = open('log2', encoding='utf-8', mode='w+')
        # f1.write('两款发动机了')
        # f1.seek(0) #######此处调整光标指针为0否则在读取的时候没有任何结果,原因写入后指针在最后,再向后读的时候没有内容
        # print(f1.read())
         # f1.close()


文件的追加:(a)

  追加模式分为a ab a+ a+b

  a模式:
    1.没有原文件,创建新文件写入
    2.存在原文件,在文件最后面追加新内容。
    3.如果另起一行追加,在前面加\n换行符即可

  a+模式:
    处理非文字类文件

  a+模式:
    追加后读,也需要调整指针

  a+b模式:
    先追加后读非文字类文件

        举例:
          # a 没有文件,新建文件写入内容
          # f1 = open('log3', encoding='utf-8', mode='a')
          # # f1.write('alex 666')
          # f1.write('\nalex 666')
          # f1.close()

          # a+
          # f1 = open('log3', encoding='utf-8', mode='a+')
          # f1.write('python')
          # f1.seek(0)
          # print(f1.read())
          # f1.close()

  其他文件操作:

    .Readtable()
      ——判断是否可读

    .Writetable()
      ——判断是否可写

    .tell()
      ——读出光标位置

    .seek()
      ——指针调整光标到0

    .seek(n)
      ——将指针任意调整到某个n的位置

    .seek(0,2)
      ——指针调整到末尾

    .truncate()
      ——将原文件按照字节进行截取
      ——w会清空文件,r没有写操作权限,所以只能在智能在A模式或者A+模式下使用

        举例:
          # f1 = open('log3', encoding='utf-8', mode='a+')
          # # f1.write('python')
          # # print(f1.read())
          # print(f1.readable())
          # print(f1.writable())
          # f1.close()


          # f1 = open('log2', encoding='utf-8')
          # f1.read()
          # print(f1.tell())
          # print(f1.seek(0))
          # print(f1.seek(0,2))
          # f1.seek(12) # 任意调整
          # f1.seek(0,2) #光标调整到最后
          # f1.seek(0) #光标调整到开头
          # print(f1.tell()) # 告诉光标的位置
          # f1.close()


          # f1 = open('log3', encoding='utf-8', mode='a+')
          # f1.truncate(3) # 按照字节对原文件进行截取 必须在a 或 a+ 模式
          # f1.close()


  其他说明:
    

    read(3):

      1. 文件打开方式为文本模式时,代表读取3个字符

      2. 文件打开方式为b模式时,代表读取3个字节

      其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

    注意:

      1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

      2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。


  With+as用法
    with open('文件名',encoding='字符集类型',mode=‘打开方式’)as f1,with open('文件名',encoding='字符集类型',mode=‘打开方式’)as f1,。。。。。。

    优点:
      1. 不用主动关闭文件句柄
      2. 一个with语句中可同时操作多个文件句柄。As一个完成后加一个逗号后面继续接新句柄。

    举例:

      # with open('log1', encoding='utf-8') as f1,\
      # open('log2', encoding='utf-8', mode='w') as f2:
      # content = f1.read()
      # f2.write(content)

      # with open('log1', encoding='utf-8') as f1:
      # print(f1.read())
      # f1.close()
      # pass
      # with open('log1', encoding='utf-8',mode='w') as f2:
      # f2.write('666')



  模拟文件的修改流程:
    1. 以读的模式,读出原文件。
    2. 以写的模式,打开新文件。
    3. 将原文件读出按照要求修改,将修改后的内容写入新文件。
    4. 删除原文件
    5. 将新文件重命名原文件

    举例:

      # import os
      # with open('file', encoding='utf-8') as f1,\
      # open('file.bak', encoding='utf-8', mode='w') as f2:
      # old_content = f1.read()
      # new_content = old_content.replace('alex', 'SB')
      # f2.write(new_content)
      #
      # os.remove('file')
      # os.rename('file.bak', 'file')

    使用for循环修改:

      # import os
      # with open('file', encoding='utf-8') as f1,\
      # open('file.bak', encoding='utf-8', mode='w') as f2:
      # for line in f1:
      # new_line = line.replace('SB','alex')
      # f2.write(new_line)
      #
      # os.remove('file')
      # os.rename('file.bak', 'file')

      为什么此处写模式能够成功修改,没有清空文件?

      原因在没有关闭writ这个文件句柄之前的,多次写操作都是可以写入的

posted @ 2018-05-27 21:38  《步枪》  阅读(309)  评论(0编辑  收藏  举报