文件操作

Posted 542684416-qq

tags:

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

 

文件操作

目录管理(os)

  • 示例

    # 执行系统命令
    # 清屏
    # os.system(‘cls‘)
    # 调出计算器
    # os.system(‘calc‘)
    ?
    # 查看操作系统类型
    # nt:表示windows,posix:表示类unix
    # print(os.name)
  • 查看当前工作目录

    import os
    #查看当前工作目录
    print(os.getcwd())
  • 创建目录:mkdir

    # os.mkdir(‘test‘)
    # 不能创建中间目录
    os.mkdir(a/b/c)
  • 创建目录:makedirs

    # 可以创建中间目录
    os.makedirs(a/b/c)
  • 删除目录:rmdir

    # 删除目录:只能是空目录,如果‘test’下还有目录,删除test下的文件,必须指定路径  os.rmdir(‘test/a‘)
    # os.rmdir(‘test‘)
    # 不能删除非空目录
    os.rmdir(a)
  • 修改名称:rename

    # 重命名:目录和文件都可以
    # os.rename(‘a‘, ‘aa‘)
    os.rename(test.py, t.py)
  • 查看文件信息:stat

    # 查看文件信息:可以是目录
    print(os.stat(t.py))
    print(os.stat(aa))
  • 查看目录文件信息:listdir

    # 查看目录文件信息
    print(os.listdir(os.getcwd()))
  • path:关于目录相关的模块

    from os import path
    import os
    ?
    # 目录拼接
    # print(path.join(‘abc/def/‘, ‘hello.py‘))
    ?
    # 提取目录
    # print(path.dirname(‘abc/def/hello.py‘))
    # print(path.dirname(os.getcwd()))
    ?
    # 提取文件名
    # print(path.basename(‘abc/def/hello.py‘))
    # print(path.basename(os.getcwd()))
    ?
    # 切割路径与文件名
    # print(path.split(‘abc/def/hello.py‘))
    # dir, name = path.split(‘abc/def/hello.py‘)
    # print(dir, name)
    ?
    # 切割文件名与后缀
    # print(path.splitext(‘hello.py‘))
    # print(path.splitext(‘abc/def/hello.py‘))
    ?
    # 判断文件是否存在,可以是目录
    # print(path.exists(‘aa‘))
    ?
    # 判断是否是目录文件
    # print(path.isdir(‘t.py‘))
    # print(path.isdir(‘aa‘))
    ?
    # 判断是否是普通文件
    # print(path.isfile(‘t.py‘))
    # print(path.isfile(‘aa‘))
    ?
    # 获取文件大小,仅限于文件
    print(path.getsize(t.py))
    # 对于目录会有问题
    print(path.getsize(aa))

    练习:统计一个目录的大小,需要使用递归

文件管理

  • 打开文件(open)

    • 示例

      fp = open(00-test.txt, r)
    • 参数

      file:操作的文件名
      mode:打开的方式
      endoding:编码方式,通常不用指定,系统会自动识别
    • 打开方式

    r:只读方式,文件不存在会报错
    w:只写方式,文件不存在则创建,存在则清空
    a:追加方式,文件不存在则创建,存在直接打开(不会清空),只能向最后追加
    r+:在r方式基础上添加可写的权限
    w+:在w方式基础上添加可读的权限
    a+:在a方式基础上添加可读的权限
    ?
    在上面的打开上添加一个字符b,表示以二进制的方式进行操作:rb、wb、ab、rb+、wb+、ab+
    说明:没有添加b的打开方式,默认的读写都是以字符串形式操作的, 带b的是以bytes形式进行的
    • 编码方式

      ASCII:美国信息交换标准代码(128)
      ansi:扩展的ASCII(256)
      gb2312:中国的ansi
      gbk:扩充的gb2312
      ?
      unicode:万国码,将所有国家的所有字符全部进行统一编码
      utf-8:一种可变长度的unicode实现方案,而且对中文支持比较友好。
  • 关闭文件

    fp.close()
  • 文件读写

    # 判断是否可读
    # print(fp.readable())
    # 读取指定长度内容
    # content = fp.read(5)
    # 读取一行
    # content = fp.readline()
    # 读取所有的行,返回一个列表
    # content = fp.readlines()
    ?
    # 判断是否可写
    # print(fp.writable())
    # 写入内容
    # fp.write(‘hello‘)
  • 操作位置

    # 文件操作位置
    # print(fp.tell())
    ?
    # 设置操作位置
    # 参数1:偏移量
    # 参数2:参考位置,0:开头,1:当前位置,2:结束
    # 以bytes形式读写seek没有问题,以str型是读写的seek只能设置从开头偏移
    fp.seek(5, 0)
  • 文件删除

    os.remove(文件名)

    练习:删除一个目录,需要使用递归

bytes类型

  • 示例:

    # s = b‘hello‘
    # print(s)
    # print(type(s))
    ?
    # 编码:str => bytes
    s = hello.encode(utf-8)
    print(type(s))
    ?
    # 解码:bytes => str
    b = s.decode(utf-8)
    print(b, type(b))

自行学习

  • StringIO

  • BytesIO

环境变量

  • 设置:set 名称=值

  • 获取:set 名称

  • 代码:

    import os
    ?
      # 获取环境变量
      # print(os.environ[‘path‘])
      # 不存在也不报错
      # print(os.environ.get(‘abc‘, ‘hello‘))
      # 等价于上面的式子
      print(os.getenv(abc, world)) 

目录表示

  • 相对目录:有参考的目录

    • ‘.‘表示当前目录,‘./‘通常可以省略

    • ‘..‘表示上一级目录,上上一级目录:../../

  • 绝对目录:

    • windows:盘符开头的目录

    • 类unix:以‘/‘开头的目录

  • 目录分隔符

    • windows:‘/‘ 或 ‘‘

    • 类unix:‘/‘

    • 建议:统一使用‘/‘

练习:路径信息全部需要拼接

  • 实现一个文件的拷贝功能,注意:大文件的问题

    import  shutil
    #拷贝文件
    shutil.copy(***,****)
  • #实现一个文件的拷贝功能,注意:大文件的问题
    import  os
    def copy(src,dst):
        #判断是否是同一文件
         if os.path.abspath(src) == os.path.abspath(dst):
             print(地址相同,无法拷贝)
             return
         #判断源文件是否是文件
         if os.path.isfile(src):
             print(不是文件怎么拷贝?)
             return
         #判断目标地址是否是目录
         if os.path.isdir(dst):
             #提取原文件名字
             src_name = os.path.basename(src)
             #拼接目标文件名
             dst = os.path.join(dst,src_name)
         #打开文件
         src_fp = open(src,r)
         dst_fp = open(dst,w)
        #循环拷贝
         while True:
             #一次读取指定长度的内容
             content = src_fp.read(1024)
             #判断是否为空
             if len(content) == 0:
                 break
            #写入目标文件
             dst_fp.write(content)
        #关闭文件
         src_fp.close()
         dst_fp.close()
    #拷贝时指定文件名
    # copy(‘00-test.txt‘,‘00-test2.txt‘)
    #拷贝时不指定文件名
    copy(00-test.txt,abc)
  • 删除一个目录

    shutil.rmtree(目录)
  • import  os
    def remove(file):
        #判断文件是否存在
        if not os.path.exists(file):
            print(file,文件不存在,无法删除)
            return
        #是普通文件
        if os.path.isfile(file):
            os.remove(file)
            return
        dirs = os.listdir(file)
        for f in dirs:
            #拼接完整文件名
            file_name = os.path.join(file,f)
            #判断文件类型
            if os.path.isfile(f):
                #是否是普通文件
                os.remove(file_name)
            else:
                #是目录文件
                remove(file_name)
        #删除目录
        os.rmdir(file)
    ?
    remove(.ida)
  • 统计一个目录的大小

    import  os
    def size(file):
        #判断是否存在
        if not os.path.exists(file):
            print(文件不存在,无法处理)
            return
        #判断是否是普通文件
        if os.path.isfile(file):
            return  os.path.getsize(file)
        #是目录需要统计一下
        total = 0
        dirs = os.listdir(file)
        for f in dirs:
            #拼接完整路径名
            file_name = os.path.join(file,f)
            #判断类型
            if os.path.isfile(file_name):
                total += os.path.getsize(file_name)
            else:
                total += size(file_name)
        return  total
    print(size(09-test.py))
  • 拷贝一个目录

    shutil.copytree(‘***‘,‘****‘)
  • #拷贝目录
    #‘abc‘--‘bca‘
    def copy_dir(src,dst):
        # 判断是否是同一文件
        if os.path.abspath(src) == os.path.abspath(dst):
            print(地址相同,无法拷贝)
            return
        #判断文件类型
        if os.path.isfile(src):
            print(src,是文件,无法拷贝)
            return 
        #判断目标地是否存在
        if not os.path.exists(dst):
            #创建目标地址
            os.makedirs(dst)
        #判断目标地址是否是目录
        if not os.path.isdir(dst):
            print(目标地址不是目录,无法拷贝)
            return 
        dirs = os.listdir(src)
        for f in dirs:
            #拼接路径
            src_file = os.path.join(src,f)
            dst_file = os.path.join(dst,f)
            if os.path.isdir(src_file):
                #是普通文件
                copy(src_file,dst_file)
            else:
                #是目录,递归处理
                copy_dir(src_file,dst_file)
    copy_dir(abc,cba)
  • 移动一个目录

    shutil.move(‘‘)
  • import  os
    def move(src,dst):
        if os.path.abspath(src) == os.path.abspath(dst):
            print(地址相同,无法移动)
            return
        if os.path.isdir(src):
            src_fp = open(src,r)
            dst_fp = open(dst,w)
            while True:
                content = src_fp.read(1024)
                # 判断是否为空
                if len(content) == 0:
                    break
                # 写入目标文件
                dst_fp.write(content)
                # 关闭文件
            src_fp.close()
            dst_fp.close()
            #删除源文件
            os.remove(src)
        else:
            if  not os.path.exists(dst):
                os.makedirs(dst)
            dirs = os.listdir(src)
            for f in dirs:
                src_file = os.path.join(src,f)
                dst_file = os.path.join(dst, f)
                move(src_file,dst_file)
            #删除原空目录
            os.rmdir(src)
    move(***,***)
  • 整理目录

    • 一个目录下有各种文件,包括文件夹

    • 将所有的目录文件都放到DIRS目录下

    • 所有无后缀的文件统一放到OTHERS目录下

    • 有后缀的文件放到后缀大写的目录下

    • 示例:


    整理前:
    test/
    dir1/
    dir2/
    dir3/
    1.py
    2.py
    3.txt
    4.pdf
    123
    456
    整理后:
    test/
    DIRS/
    dir1/
    dir2/
    dir3/
    OTHERS/
    123
    456
    PY/
    1.py
    2.py
    TXT/
    3.txt
    PDF/
    4.pdf
    import os
    import  shutil
    ?
    def deal(dir):
        if os.path.isdir(dir):
            print(是文件)
            return
        dirs = os.listdir(dir)
        for f in dirs :
            #拼接完整路径
            file_name = os.path.join(dir,f)
            #分类处理
            if os.path.isdir(file_name):
                #是目录
                #拼接DIRS目录名
                DIRS = os.path.join(dir,DIRS)
                #创建
                if not os.path.exists(DIRS):
                    os.makedirs(DIRS)
                #移动
                shutil.move(file_name,DIRS)
            else:
                #按照‘。’进行切割
                lt = file_name.rsplit(.,1)
                if len(lt) == 1:  #没有后缀
                    #OTHERS
                    OTHERS = os.path.join(dir, OTHERS)
                    # 创建
                    if not os.path.exists(OTHERS):
                        os.makedirs(OTHERS)
                    # 移动
                    shutil.move(file_name, OTHERS)
                else:
                    # OTHERS
                    SUFFIX = os.path.join(dir, SUFFIX)
                    # 创建
                    if not os.path.exists(SUFFIX):
                        os.makedirs(SUFFIX)
                    # 移动
                    shutil.move(file_name, SUFFIX)
    deal(***)

    ?




































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

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

VSCode 如何操作用户自定义代码片段(快捷键)

代码片段 - Golang 实现集合操作

Apollo Codegen 没有找到生成代码的操作或片段

VSCode自定义代码片段——.vue文件的模板

操作栏标签片段中的片段?