zoukankan      html  css  js  c++  java
  • Python3文件路径/目录获取教程

    一、获取文件路径实现

    1.1 获取当前文件路径

    import os
    
    current_file_path = __file__
    print(f"current_file_path: {current_file_path}")

    __file__变量其实有个问题,当文件被是被调用文件时__file__总是文件的绝对路径;但当文件是直接被执行的文件时,__file__并不总是文件的绝对路径,而是你执行该文件时给python传的路径。比如你是python xxx/yyy.py形式执行的,那么此时__file__的值就是xxx/yyy.py。

    可以使用以下更统一的方式获取文件路径:

    import inspect
    
    current_file_name = inspect.getfile(inspect.currentframe())
    print(f"current_file_name: {current_file_name}")

    1.2 获取调用文件的文件路径

    有时候我们想要获取调用当前文件的父文件的文件路径,此时可以通过以下代码实现:

    import inspect
    
    def be_call_fun():
        # stack()返回的是调用栈列表。
        frame_stack = inspect.stack()
        # 0是标识当前函数的栈,1是标识上一层函数的栈,依此类推。
        # 也就是这个数值不一定是1,要看你要获取其文件路径的函数在第几层
        caller_frame = frame_stack[1]
        caller_file_path = caller_frame.filename
        # 由于当前调用函数和被调用函数放在同一个文件,所以文件名还是当前文件名
        # 可将调用函数和被调用函数放到不同文件进行观察
        print(f"caller_file_path: {caller_file_path}")
    
    def caller_fun():
        be_call_fun()
    
    if __name__ == "__main__":
        caller_fun()

    二、获取目录

    2.1 获取当前工作目录

    所谓当前工作目录,就是你执行python命令执行python文件时,shell所在的文件夹。

    import os
    
    current_working_dir = os.getcwd()
    print(f"current_working_dir: {current_working_dir}")

    2.2 借助路径获取目录

    第一大节我们已经借绍了几种获取文件路径的方式,要获取对应的文件所处的文件夹,可直接借助这些路径+os.path.dirname()实现。

    import os
    
    # 文件绝对路径
    current_file_path = __file__
    # 借助dirname()从绝对路径中提取目录
    current_file_dir = os.path.dirname(current_file_path)
    print(f"current_file_dir: {current_file_dir}")
    
    # 类似地可以借助basename()从绝对路径中提取文件名
    # current_filename = os.path.basename(current_file_path)
    
    # 另外建议使用os.path.join()来实现路径拼接,这样不用自己再关注路径分隔符的问题
    # 再有是os.path.join()参数并不一定要就是目录+文件名形式,不管多少个参数都可以拼接
    # current_file_path = os.path.join(current_file_dir, current_filename)

    三、文件和目录的其他一些操作

    3.1 文件的常用操作

    r--读模式打开文件,如果文件不存在则报错。
    r+--读写模式打开文件,如果文件不存在则报错。写时原有内容不会被清空,而是被替换式覆盖。
    w--写模式打开文件,如果文件不存在则创建。已有内容会被清空。
    w+--读写模式打开文件,如果文件不存在则创建。已有内容会被清空。
    a--追加模式打开文件,如果文件不存在则创建。
    a+--读追加模式打开文件,如果文件不存在则创建。
    import os
    
    
    file_name = "test.txt"
    new_file_name = "new_test.txt"
    
    # 创建空白文件
    open(file_name, 'w').close()
    
    # 删除文件
    os.remove(file_name)
    
    # 重命名文件
    os.rename(file_name, new_file_name)
    
    # 读文件
    with open(file_name, 'r') as fd:
        # 读取所有内容
        fd.read()
        # 读取一行
        fd.readline()
        # 读取所有行,返回为各行组成的形表
        fd.readlines()
    
    # 遍历文件各行简洁写法
    for line in open(file_name, 'r', encoding='utf-8'):
        print(line)
    
    # 写文件
    with open(file_name, 'w') as fd:
        # 向文件写入内容,需要自行添加
    
        fd.write("test_str")
        # 向文件写入内容,需要自行添加
    
        # 和write的区别是,其参数除了可以是字符串,还可以是字符串列表
        fd.writelines(["test_str", "test_str"])

    3.2 目录的常用操作

    import os
    
    
    dir_name = "test_dir/dir_name"
    new_dir_name = "test_dir/new_dir_name"
    
    # 创建目录。此种形式是的于shell的mkdir,在父目录不存在时会创建失败
    os.mkdir(dir_name)
    # 创建目录。此种形式是的于shell的mkdir -p,在父目录不存在时会自动创建父文件夹
    os.makedirs(dir_name, exist_ok=True)
    
    # 删除目录。此种形式相当于shell的rmdir,在目录非空时删除失败
    os.rmdir(dir_name)
    # 删除目录。此种形式相当于shell的rm -rf
    import shutil
    shutil.rmtree(dir_name)
    
    # 重命名目录。
    os.rename(dir_name, new_dir_name)
    
    # 遍历目录
    # dir_path是当前遍历到的目录。dir_names是dir_path下的文件夹列表。file_names是是dir_path下的文件列表
    # 如果想实现目录白名单,将白名单目录从dir_names中去除即可
    for (dir_path, dir_names, file_names) in os.walk(dir_name):
        for file_name in file_names:
            print(os.path.join(dir_path, file_name))
  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/lsdb/p/13265688.html
Copyright © 2011-2022 走看看