Python文件操作

Posted 慕|白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python文件操作相关的知识,希望对你有一定的参考价值。

一、关于文件

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

二、读写文件简单操作

  • 1.读取文件 read

    #打开文件
    file = open("demo_02/1.txt",mode="r")
    #读取文件
    ret = file.read()
    print(ret)
    #关闭文件
    file.close()
    # file叫做文件句柄(变量),用来操作文件
    #第一个参数是文件的路径
    #第二个参数 mode=访问文件的模型,r表示读,默认是r模式
    #文件找不到会报错
    
  • 2.写文件 write

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

三、文件权限

  • rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。

    注意:二进制文件把内容表示为一个特殊的 bytes 字符串类型。

  • r+ 打开一个文件用于读写。文件指针将会放在文件的开头。

  • rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。

    # file = open("demo/1.png","rb")
    file = open("demo_02/1.txt","rb")
    ret = file.read()
    print(ret)
    
    # r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    file = open("demo_02/1.txt","r+")
    file.write("zhang wei qiang")
    file.close()
    
  • w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑, 即原有内容会被删除。

    如果该文件不存在,创建新文件。

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

  • w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即 原有内容会被删除。如果该文件不存在,创建新文件。

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

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

  • ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文 件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。

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

  • ab+ 以二进制格式打开一个文件用于读写。如果该文件已存在,文件指针将会放在文 件的结尾。如果该文件不存在,创建新文件用于读写。

    file = open("demo_02/2.txt","a")
    file.write("python")
    file.close()
    
    file = open("demo_02/2.txt","a+")
    ret = file.read()
    print(ret)
    file.close()
    

文件操作

  • read()

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

      file = open("demo_02/2.txt","r")
      print(file.read(5))
      print(file.read(5))
      print(file.read(5))
      file.close()
      
  • readline()

    • readline 每次读取一行,并且自带换行功能 每一行末尾会读到

      #可以指定每行读取的字符长度,下一次读取会从此位置开始
      file = open("demo_02/1.txt","r")
      print(file.readline())
      print(file.readline())
      print(file.readline())
      file.close()
      
  • readlines()

    • 一次性以行的形式读取文件的所有内容并返回一个 list,需要去遍历读出来

      file = open("demo_02/1.txt","r")
      ret = file.readlines()
      # print(ret)
      for i in ret:
          print(i,end=‘‘)
      file.close()
      
  • 循环读取

    • file 句柄是一个可迭代的对象因此,可以循环读取文件中的内容,每次读一行

      file = open("demo_02/1.txt","r")
      for i in file:
          print(i,end=‘‘)
      file.close()
      
  • 写入write和writelines(多条数据一次性写入)

    file = open("demo_02/3.txt",‘w‘)
    # file.write("zhangweiqiang")
    
    lst = ["hello","world","zs","ls"]
    for i in lst:
        file.write(i)
    # file.writelines(lst)
    
    file.close()
    
  • cvs 文件读写

    • 写入cvs文件,必须创建 csv 模块中对应的 writer 对象,通过 writer 对象完成文件内容的写入操作

    • 读取 csv 文件的操作,主要通过 csv 模块中的 reader 对象来完成,通过加载文件数据到 reader 对象中,文件中的数据就会按照固定的格式读取到程序中进行处理

      file = open("demo_02/movie.csv","w",newline="")
      writer = csv.writer(file)
      writer.writerow(["电影名称","评分","演员","网址"])
      writer.writerows([["战狼"," 9.0","吴京","www.zhanlang.com"],
                       ["战狼2"," 9.2","吴京","www.zhanlang2.com"]])
      file.close()
      
      
      file = open("demo_02/movie.csv","r",newline="")
      reader = csv.reader(file)
      # print(reader)  #<_csv.reader object at 0x0000000002205F50>
      for i in reader:
          print(i)
      file.close()
      
    • 爬取豆瓣电影写入csv文件

      import csv
      file = open("demo_02/movie2.csv","w",newline="")
      writer = csv.writer(file)
      writer.writerow(["电影名称","评分","演员","网址"])
      for i in movie_dict2["data"]:
          # print(i["title"],i["rate"],i["casts"],i["url"])
          movie_name = i["title"]
          rate = i["rate"]
          casts = i["casts"]
          url = i["url"]
          writer.writerow([movie_name,rate,casts,url])
      
      file.close()
      
  • 使用 wIth 方式操作文件,可以不用关闭文件,会自动关闭文件

    # with open("demo_02/1.txt","r") as file:
    #     print(file.read())
    
    #with 内部实现了__enter__和__exit__方法,会自动关闭文件
    
    class Foo:
        def __init__(self):
            print("--init--")
        def test(self):
            print("--test--")
        def __enter__(self):
            print("enter")
            return self
        def __exit__(self, exc_type, exc_val, exc_tb):
            print("with执行完毕,调用exit")
    with Foo() as f:
        f.test()
    print("最后一行代码")
    
  • 乱码:Python 读写文件时,默认使用的编码为平台编码,也就是 gbk, 在 pycharm 中创建的文件默认使用的是 utf-8 编码

    • 注意:在打开文件时,指定编码,避免出现乱码问题

os 模块

使用 os 模块对文件进行一些相关操作

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

    import os
    # os.rename("demo_02/1.txt","demo_02/111.txt")
    os.rename("demo_02/2.txt","222.txt")
    
  • 2.删除文件 os.remove(文件名)

    #删除demo_02/3.txt
    os.remove("demo_02/3.txt")
    
  • 3.创建单层目录 os.mkdir(目录名)

    #创建test1目录
    os.mkdir("test1")
    

    创建多级目录 os.makedirs(目录名)

    os.makedirs("a/b/c/d")
    
  • 4.删除单层目录 os.rmdir(目录名)

    os.rmdir("test1") #只能删除空目录
    

    删除多级目录 os.removedirs(目录名)

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

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

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

    print(os.listdir("E:python0421day13code"))
    
  • 7.切换所在目录 os.chdir()

    # print(os.getcwd())
    os.chdir("a/b")
    # print(os.getcwd())
    with open("222.txt","w")as file:
        file.write("hello world")
    
  • 8.判断文件或文件夹是否存在 os.path.exists()

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

    print(os.path.isfile("222.txt"))
    print(os.path.isfile("a"))
    
  • 10.判断是否是目录 os.path.isdir()

    print(os.path.isdir("222.txt"))
    print(os.path.isdir("a"))
    
  • 其他

    #获取绝对路径 os.path.abspath()
    print(os.path.abspath("222.txt"))
    
    # 获取路径中的最后部分
    print(os.path.basename("222.txt"))
    print(os.path.basename(r"E:python0421day13code222.txt"))
    
    #判断是否是绝对路径 os.path.isabs()
    print(os.path.isabs("222.txt"))
    print(os.path.isabs(r"E:python0421day13code222.txt"))
    
    #获取文件所在目录,os.path.dirname
    print(os.getcwd())
    print(os.path.dirname(r"E:python0421day13codea11.txt"))
    print(os.path.dirname(r"E:python0421day13codea"))
    
  • 文件定位

    #tell()查看文件定位
    # with open("222.txt","r") as f:
    # with open("222.txt","a") as f:
    #     print(f.tell())
    
    #seek(offset,whence) offset偏移量,whence定位(0文件开头,1定位不变,2文件结尾)
    with open("222.txt","r") as f:
        print(f.tell())
        f.seek(2,0)
        print(f.tell())
        print(f.read())
    
  • 文件操作练习

    1.封装函数,可以实现文件复制(先读取目标文件,再写入新文件)
    如:将111.txt复制一份,文件名为222.txt
    
    2.封装函数,可以实现文件备份(先读取目标文件,再写入新文件)
    如:将111.txt复制一份,文件名为111_副本.txt
    
    3.封装函数,打印某个文件内的所有的文件名
    
    

以上是关于Python文件操作的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

常用python日期日志获取内容循环的代码片段

VSCode自定义代码片段——git命令操作一个完整流程

使用 Python 代码片段编写 LaTeX 文档

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程