Python如何获取文件路径/目录


Posted in Python onSeptember 22, 2020

一、获取文件路径实现

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:
  # 向文件写入内容,需要自行添加\n
  fd.write("test_str")
  # 向文件写入内容,需要自行添加\n
  # 和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))

以上就是Python如何获取文件路径/目录的详细内容,更多关于Python获取文件路径/目录的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python lambda和Python def区别分析
Nov 30 Python
python使用Tesseract库识别验证
Mar 21 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
Jan 14 Python
python列表使用实现名字管理系统
Jan 30 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
python防止随意修改类属性的实现方法
Aug 21 Python
python列表推导式入门学习解析
Dec 02 Python
python中remove函数的踩坑记录
Jan 04 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 #Python
python 实现压缩和解压缩的示例
Sep 22 #Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 #Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 #Python
python 线程的五个状态
Sep 22 #Python
python 如何实现遗传算法
Sep 22 #Python
利用python汇总统计多张Excel
Sep 22 #Python
You might like
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
php下实现折线图效果的代码
2007/04/28 PHP
php跨站攻击实例分析
2014/10/28 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
用JAVASCRIPT如何给<textarea></textarea>赋值
2007/04/20 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
浅谈Nodejs观察者模式
2015/10/13 NodeJs
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
jquery的 filter()方法使用教程
2018/03/22 jQuery
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
python3爬虫之设计签名小程序
2018/06/19 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
python numpy中cumsum的用法详解
2019/10/17 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
团组织推优材料
2014/12/29 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
运动会1000米加油稿
2015/07/21 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏