初始Python文件操作

初始文件操作

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

  • 利用Python代码打开文件

    #1. 打开文件,得到文件句柄并赋值给一个变量
    f=open('D:\\file\a.txt','r',encoding='utf-8') #默认打开模式就为r
    #2. 通过句柄对文件进行操作
    data=f.read()
    ​
    #3. 关闭文件
    f.close()
    # f: 就是一个变量,一般都会将它写成f,f_obj,file,f_handler,fh,等,它被称作文件句柄。
    # open:是Python调用的操作系统(windows,linux,等)的功能。
    # 'D:\\file\a.txt': 这个是文件的路径。
    # mode: 就是定义你的操作方式:r为读模式。
    # encoding: 不是具体的编码或者解码,他就是声明:此次打开文件使用什么编码本。一般来说:你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8(有些使用的是gbk)。
    # f.read():你想操作文件,比如读文件,给文件写内容,等等,都必须通过文件句柄进行操作。
    # close(): 关闭文件句柄(可以把文件句柄理解成一个空间,这个空间存在内存中,必须要主动关闭)

     

    练习的过程中可能会出现的错误

    • FileNontFoundError,路径错误

      • 解决方式一:使用两个转义符,'D:\\file\\a.txt'

      • 解决方式二:在路径前面加一个r(推荐),r'D:\\file\a.txt'

    • UnicodeDecodeError,编码错误

      • 打开文件时的编码与存储文件的编码不统一,换成统一编码即可

文件操作:读

  • r 模式

    以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件

    • read()

      read()将文件中的内容全部读取出来,如果文件很大就会非常的占用内存,容易导致内存崩溃

      file_1 = open('path1/test.txt', mode='r', encoding='utf8')
      msg = file_1.read()
      file_1.close()
      print(msg)
      ​
      结果:
      曾虑多情损梵行, 入山又恐别倾城,
      世间安得两全法, 不负如来不负卿。
    • read(n)

      read()读取的时候指定读取到什么位置,在r模式下,n按照字符读取

      file_1 = open('path1/test.txt', mode='r', encoding='utf8')
      msg1 = file_1.read(3)  # 读取三个字符
      msg2 = file_1.read()   # 读取剩余的
      file_1.close()
      print(msg1)
      print(msg2)
      ​
      结果:
      曾虑多
      ​
      情损梵行, 入山又恐别倾城,
      世间安得两全法, 不负如来不负卿。
    • readline()

      readline()读取,每次只读取一行,readline()读取出来的数据后面都有一个\n

      file_1 = open('path1/test.txt', mode='r', encoding='utf8')
      msg1 = file_1.readline()
      msg2 = file_1.readline()
      file_1.close()
      print(msg1)
      print(msg2)
      ​
      结果
      曾虑多情损梵行, 入山又恐别倾城,
      ​
      世间安得两全法, 不负如来不负卿。
      ​
      # 解决\n问题 只需要在读取文件的后边加一个strip()就行了
      msg1 = file_1.readline().strip()
    • readlines()

      readlines()返回一个列表,列表里面的每个元素是原文件的一行,如果文件很大,占内存,容易崩盘

      file_1 = open('log', encoding='utf-8')
      print(file_1.readlines())
      file_1.close()
      ​
      结果
      # ['123\n', '233\n', 'sdsd\n', 'sds1\n']
    • for循环(推荐使用)

      可以通过for循环去读取,文件句柄是一个迭代器,他的特点就是每次循环只在内存中占用一行数据,非常节省内存

      file_1 = open('path1/file.txt',mode='r',encoding='utf-8')
      ​
      for line in file_1:
          print(line)    # 这种方式就是在一行一行的进行读取
  • rb模式

    以二进制的格式打开一个文件用于只读,文件会将指针放在文件的开头,带b开头的都是以二进制的格式操作文件(主要是非文字文件:图片 音频,视频等)如果是带b的模式操作文件,那么不用声明编码方式

    file1 = open('imag.jpg',mode='rb')
    print(file1.read()) # 二进制方式打开文件
    file.close()
    ​
    # rb模式也有 read() read(n) readline() readlines() for循环 这几种方法,这里就不演示了

文件操作:写

在文件中写入内容,主要四种模式:w,wb,w+,w+b

  • W模式

    • 如果文件不存在,利用W模式操作文件,那么他会先创建文件,然后写入内容

      # 没有文件,创建文件写入内容
      f = open('test1',mode='w',encoding='utf8')
      f.write('马猴烧酒那月酱')    # 以字符串的方式写入
      f.close()
    • 如果文件存在,利用w模式操作文件,先清空原文件内容,然后写入新内容

      # 文件存在,先清空原文件,在写入内容
      f = open('test1',mode='w',encoding='utf8')
      f.write('那月酱挂了')    # 以字符串的方式写入
      f.close()
  • WB模式

    wb模式:以二进制格式打开一个文件只用于写入,如果该文件存在则打开文件,删除原内容在编辑,如果文件不存在,创建新文件。(一般用于:图片,视频,音频等)

    # 以二进制打开第一个文件 并写入第二个文件
    file1 = open('a.jpg',mode='rb')
    content = file1.read()
    file1.close()
    ​
    file2 = open('b.jpg',mode='wb')
    file2.write(content)
    file2.close()

文件操作:追加

在文件中追加文件,主要分四种:a,ab,a+,a+b

  • a模式

    打开一个文件用于追加,如果文件已存在,文件指针会放在文件的结尾,也就是说,新的内容会写在已有内容之后。如果文件不存在,创建新文件再写入

    • 如果文件不存在,利用a模式操作文件,那么他会先创建文件,然后写入内容

      file_1 = open('test',mode='a',encoding='utf-8')
      file_1.write('没有文件,先创建文件')
      file.close()
    • 如果文件存在,利用a模式操作文件,anemia他会在文件的最后面追加内容

      file_2 = open('test',mode='a',encoding='utf-8')
      file_2.writr('在文本的后面追加一些内容')
      file_2.close()

文件的其他操作模式

#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
​
#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
​
#3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】
​
#4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】
  • r+模式

    打开一个文件用于读写,文件默认指针将放在文件的开头

    file1 = open('test',mode='r+',encoding='utf-8')
    content = file1.read()
    print(content)
    file1.write('在后面追加一些内容')
    file1.close()

    如果在读写模式下,先写后读,那么文件就会出问题,因为默然指针在文件的最开始,要是先写,写入的内容会覆盖掉原内容,然后再读取

文件操作的其他功能

  • read()

    • 文件打开方式为W模式时,代表读取N个字符

    • 文件打开方式为B模式时,代表读取N个字节

  • seek()

    • seek(n):指针移动到n的位置(移动单位是byte,如果是utf-8的中文部分要是三的倍数

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

      • 开头:seek(0)

      • 结尾:seek(0,2)

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

    f = open("test", 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 * 3个 = 9
    f.flush() # 清空缓存数据 直接写入文件
    f.close()
  • tell()

    使用tell()可以帮助我们获取当前指针在什么位置

    f = open("test", mode="r+", encoding="utf-8")
    f.seek(0) # 指针移动到开头
    content = f.read() # 读取内容, 此时指针移动到结尾
    print(content)
    print(content.tell()) # 获取当前指针位置
    f.close()
  • readable(),writeable()

    f = open('Test',encoding='utf-8',mode='r')
    print(f.readable())  # True
    print(f.writable())  # False
    content = f.read()
    f.close()

打开文件的另一种方式

# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
with open('t1',encoding='utf-8') as f1:
    f1.read()
    
# 2,一个with 语句可以操作多个文件,产生多个文件句柄。
with open('t1',encoding='utf-8') as f1,\
        open('Test', encoding='utf-8', mode = 'w') as f2:
    f1.read()
    f2.write('一串数据')

文件的修改

  • 文件上的数据都是存放于硬盘上的,因此只存在覆盖,不存在修改这么一说,具体有两种实现方式

    • 方式一:将硬盘存放的该文件的内容全加载到内存,在内存中是可以修改的,修改完毕后,再有内存覆盖到硬盘

      import os
      ​
      with open('a.txt','r+') as f1:
          data=f1.read()
          data=data.replace('cat','xin') #在内存中完成修改
          f1.write(data)
    • 方式二:将内存存放该文件的内用一行一行读入内存,修改文件完毕就写入新文件,然后用新文件覆盖原文件

      import os  # 调用系统模块
      ​
      with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
          data=read_f.read() #全部读入内存,如果文件很大,会很卡
          data=data.replace('cat','xin') #在内存中完成修改
      ​
          write_f.write(data) #一次性写入新文件
      ​
      os.remove('a.txt')  #删除原文件
      os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件

       

    •  

posted @ 2018-12-29 20:07  CatdeXin  阅读(284)  评论(0)    收藏  举报