文件操作和异常处理

一、关于文件

  • 文件的作用:把一些数据储存起来
  • 使用文件流程:
    • 打开文件,读写文件,关闭文件

二、读写文件简单操作

  • 1.读取文件

    #打开文件
    file = open("demo1/1.txt",mode="r")
    #读取文件
    ret = file.read()  #file只是变量,read是读取函数
    print(ret)
    #关闭文件
    file.close()
    #第一个参数的文件的路径
    #第二个参数mode=访问文件的模型,r表示读,默认是r模式
    
  • 2.写入文件

    2.写文件 write
    file = open("demo1/1.txt",mode="w")
    file = open("demo1/111.txt",mode="w") #文件不存在,会自动创建
    file = open("demo2/111.txt",mode="w") #不会创建目录
    file.write("huangzhi")
    file.close()
    

三、文件权限

  • rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。
    注意:二进制文件把内容表示为一个特殊的 bytes 字符串类型。

    # file = open("demo1/1.txt","rb")
    file = open("demo1/1.png","rb")
    ret = file.read()  #b'huangzhi'   huangzhi
    print(ret)
    file.close()
    
  • r+ 打开一个文件用于读写。文件指针将会放在文件的开头。

    file = open("demo1/1.txt","r+")
    # ret = file.read() #读取全部内容
    # print(ret) 
    file.write("guyin") #从头写入,原有内容会逐渐被覆盖
    file.close()
    
  • rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。

  • wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

    from demo1.img import img2
    file = open("demo1/2.jpg","wb")
    file.write(img2)
    file.close()
    
  • w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即 原有内容会被删除。如果该文件不存在,创建新文件。

    file = open("demo1/1.txt","w+")
    file.write("hello world")
    ret = file.read()
    print(ret)
    file.close()
    
  • a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
    也 就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件 进行写入。

    #在demo1下的111.txt中追加“guyin”
    # file = open("demo1/111.txt","a")
    file = open("demo1/3.txt","a")
    file.write("guyin")
    file.close()
    
  • ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文 件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。

  • a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。
    文 件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

    file = open("demo1/111.txt","a+")
    file.write("yangyong")
    ret = file.read()
    print(ret)
    file.close()
    
  • ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文 件的结尾。如果该文件不存在,创建新文件用于读写。

四、文件高级操作

  • 调用 read()会一次性读取文件的全部内容,如果文件有 10G,内存就爆了,会导致程序卡死,
    所以,要保险起见,可以反复调用 read(size)方法,每次最多读取 size 个字符的内容

    file = open("demo1/111.txt","r")
    ret1 = file.read(5)
    ret2  = file.read(5)
    # print(ret1)
    print(ret2)
    file.close()
    
  • readline 每次读取一行,并且自带换行功能 每一行末尾会读到\n可以指定每行读取的字符长度,下一次读取会从此位置开始

    f = open("demo1/4.txt","r")
    # ret = f.read()
    print(f.readline(3))
    print(f.readline(3))
    print(f.readline(3))
    f.close()
    
  • readlines,一次性以行的形式读取文件的所有内容并返回一个 list,需要去遍历读出来

    f = open("demo1/4.txt","r")
    ret = f.readlines()
    # print(ret)
    for i in ret:
        print(i,end='')
    f.close()
    
  • file 句柄是一个可迭代的对象因此,可以循环读取文件中的内容,每次读一行

    f = open("demo1/4.txt","r")
    # print(f) #文件句柄,是一个可迭代对象
    for i in f:
        print(i)
    f.close()
    
  • write和writelines(多行一次性写入)

    file = open("demo1/5.txt","w")
    # file.write("yangyong")
    # file.write("zhuzucheng")
    
    # lst = ["yangyong","zhuzucheng"] #列表中必须是字符串
    lst = ["yangyong","zhuzucheng",10]
    # for i in lst:
    #     file.write(i)
    file.writelines(lst)
    file.close()
    
  • cvs文件读写

    • 写入 CSV 文件 必须创建 csv 模块中对应的 writer 对象,通过 writer 对象完成文件内容的写入操作
    f = open("demo1/movie.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["电影名称","评分","演员","网址"])
    writer.writerows([["唐人际探案1","8.5","刘昊然","www.movei1.com"],
                    ["唐人际探案2","8.6","刘昊然","www.movei2.com"],
                    ["唐人际探案3","8.7","刘昊然","www.movei3.com"]])
    f.close()
    
    • 读取 csv 文件的操作,主要通过 csv 模块中的 reader 对象来完成,通过加载文件数据到 reader 对象中,文件中的数据就会按照固定的格式读取到程序中进行处理
    f = open("demo1/movie.csv","r",newline='')
    reader = csv.reader(f)
    # print(reader) #<_csv.reader object at 0x0000000001EACCE0>
    for i in reader:
        print(i)
    f.close()
    

    将豆瓣电影写入csv文件:电影名称,评分,演员,网址

    from demo1.movie import movie_dict2
    print(movie_dict2)
    for i in movie_dict2["data"]: #遍历列表,取出字典对应的数据
        print(i['title'],i['rate'],i['casts'],i['url'])
    
    f = open("demo1/movie2.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["电影名称","评分","演员","网址"])
    for i in movie_dict2["data"]:
        movie_name = i['title']
        rate = i['rate']
        casts = i['casts']
        url = i["url"]
        writer.writerow([movie_name,rate,casts,url])
    f.close()
    

五、os模块

import os

  • 1.重命名文件 os.rename(旧文件名,新文件名)

    重命名文件  os.rename(旧文件名,新文件名)
    os.rename("demo1/3.txt", "demo1/333.txt")
    
  • 2.删除文件 os.remove(文件名)

    删除文件 os.remove(文件名)
    os.remove("demo1/111.txt")
    
  • 3.创建目录

    • 创建单层目录 os.mkdir(目录名)
    os.mkdir("demo2")
    
    • 创建多级目录 os.makedirs(多级目录)
  • 4.删除目录

    • 删除单层目录 os.rmdir(目录名)
    os.rmdir("demo2")
    
    • 删除多层目录 os.removedirs(多级目录)

    若目录为空,则删除,并递归到上一级目录,如若也为空,继续删除,以此类推,如果上一次目录不为空,则停止删除文件

    os.removedirs("a/b/c/d")
    
  • 5.获取当前所在目录 os.getcwd()

    print(os.getcwd())
    
  • 6.获取目录列表 os.listdir(path) path是路径

    print(os.listdir(os.getcwd()))
    print(os.listdir("demo_03os模块.py")) #必须是目录
    print(os.listdir("a"))
    
  • 7.切换所在目录 os.chdir(path)

    os.chdir("a")
    with open("1.txt","w") as f:
        f.write("hello")
    
  • 8.判断文件或文件夹是否存在os.path.exists()

    print(os.path.exists("a")) #True
    print(os.path.exists("1.txt")) #False
    
  • 9.判断是否是文件 os.path.isfile(path)

    print(os.path.isfile("a"))  #False
    print(os.path.isfile("demo_01文件基本操作.py")) #True
    
  • 10.判断是否是目录 os.path.isdir(path)

    print(os.path.isdir("a"))  #True
    print(os.path.isdir("demo_01文件基本操作.py")) #False
    

异常

  • 定义:异常是指在语法正确的前提下,程序运行时报错就是异常

  • 当python脚本发生异常时,我们应该捕获它,否则程序会终止执行

    print("hello world")
    print(1/0)
    print("代码结束")
    
  • 异常处理 try...except

    • 程序自上往下执行,先执行try中的代码,如果代码中有异常,则不会继续执行try下面的代码,会执行except中的异常代码
    • 如果try中没有异常,则不会执行except中的代码
    try:
        print("hello")
        print(1/0)
        print("world")
    except:
        print("try中有异常代码")
    print("代码结束")
    #ZeroDivisionError,IndexError,NameError,TypeError,FileNotFoundError
    
  • try...except...else

    • try中代码正常执行结束,不会走except,走else
    • try中有异常,会走except,不走else
    try:
        print("hello")
        # print(1/0)
        print("world")
    except:
        print("出现异常")
    else:
        print("else中的代码")
    print("finish")
    
  • try..except...else ...finally

    • 无论代码是否有异常,都会走finally

      try:
          print("hello")
          # print(1/0)
          print("world")
      # except ZeroDivisionError:
      #     print("0为除数的异常")
      except NameError:
          print("命名异常")
      else:
          print("else中的代码")
      finally:
          print("finish")
      
  • 获取异常信息

    try:
        print("hello")
        print(1/0)
        print("world")
    # except BaseException as e:
    except Exception as e:
        print(e)
    

触发异常

  • 用户可以根据业务逻辑手动抛出异常

    并且用户可以根据需求来抛出系统异常和用户的自定义异常

    try:
        name = input("请输入注册用户名:")
        if name.isalpha():
            raise Exception("不可以全部是字母")
    except Exception as e:
        print(e)
    
    

你可能感兴趣的:(文件操作和异常处理)