前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看完这篇,再也不用头疼文件「路径」的问题啦

看完这篇,再也不用头疼文件「路径」的问题啦

作者头像
编程文青李狗蛋
发布2019-11-07 16:39:48
3490
发布2019-11-07 16:39:48
举报
本文字数:2996 字 阅读本文大概需要:6 分钟

写在之前

在实际应用过程中,我们经常会和各种文件打交道,「文件」是计算机中非常重要的东西,之前写过两篇关于 Python 操作文件的文章,不熟悉的可以先看看:

零基础学习 Python 之文件(一)

零基础学习 Python 之文件(二)

说到了文件,自然就会涉及到文件「路径」的问题,很多人对这一块不太熟悉,在程序中想要使用文件的时候不知道该如何去确定文件所在的路径或者不知道如何去构造一个让文件存储的路径,今天就让我们来彻底解决这个问题。

这里主要用到的是 os.path 模块,在此之前我们需要先了解一下 getcwd 和 listdir 函数,因为下面的示例中会用到,这俩是 os 模块下的。getcwd 用来获取当前目录, listdir 是显示目录下的所有子目录和文件,具体的操作我在下面这篇文章中详细写过,建议先看一下:

Python 标准库之 OS

构建路径

os.path 模块用来管理文件路径问题,它中包含了很多用以构建路径的函数,其中最常用的便是 join,abspath 以及 expanduser 函数:

  • join:拼接路径(不同的操作系统使用不同的分隔符拼接);
  • abspath:得到绝对路径;
  • expanduser:展开用户的 home 目录。

具体的操作实例如下所示:

代码语言:javascript
复制
>>> import os
>>> os.getcwd()
'/root/rocky0429'
>>> os.listdir()
['test.py', 'c.py', 'b.txt', 'a.txt']
>>> os.path.join('~','rocky0429','a.txt')
'~/rocky0429/a.txt'
>>> os.path.abspath('.')
'/root/rocky0429'
>>> os.path.abspath('..')
'/root'
>>> os.path.abspath('../rocky0429/b.txt')
'/root/rocky0429/b.txt'
>>> os.path.expanduser('~')
'/root'
>>> os.path.expanduser('~/rocky0429')
'/root/rocky0429'
>>> os.path.expanduser('~/rocky0429/c.py')
'/root/rocky0429/c.py'

上述代码中的 os.path 模块中的 abspath 函数用来返回一个相对路径的绝对路径,那么相应的,也会存在一个函数 isabs 来检查某路径是否为绝对路径:

代码语言:javascript
复制
>>> os.path.isabs('/root/rocky0429/test.py')
True
>>> os.path.isabs('~')
False

当然在写代码的时候,有时候需要导入当前源文件所在目录下的其他包,这个时候就需要获取当前源文件的父目录,那么如何获取呢?我们可以用 __file__ 这个变量来表示,具体操作如下所示:

代码语言:javascript
复制
# coding:utf-8
import os

source_file_path = os.path.abspath(__file__)

print('Current working directory : {}'.format(os.getcwd()))
print('Source file address : {}'.format(source_file_path))

输入的结果如下所示:

代码语言:javascript
复制
Current working directory : /root/rocky0429
Source file address : /root/rocky0429/test.py

拆分路径

我们使用 Python 可以很方便的构建文件路径,当然也可以很舒服的对文件路径进行拆分,os.path 模块在拆分路径中常用的是 split/splitext,dirname 以及 basename 函数:

  • split:返回一个二元组,包括文件的路径和文件名;
  • splitext:也是返回一个二元组,包括扩展名和去除扩展名的部分;
  • dirname:返回文件所在路径;
  • basename:返回文件名。

具体的操作实例如下所示:

代码语言:javascript
复制
>>> import os
>>> source_file_path = '/root/rocky0429/test.py'
>>> os.path.split(source_file_path)
('/root/rocky0429', 'test.py')
>>> os.path.splitext(source_file_path)
('/root/rocky0429/test', '.py')
>>> os.path.dirname(source_file_path)
'/root/rocky0429'
>>> os.path.basename(source_file_path)
'test.py'

判断路径是否存在

os.path 模块也提供了一些函数来判断某条路径是否存在,还能判断处在这个条路径的文件的类型,常用的便是 exists,isfile 以及 isdir 函数(is 开头是判断类函数,返回布尔类型结果):

  • exists:判断某条路径是否存在;
  • isfile:判断路径是否存在且为一个文件;
  • isdir:判断路径是否存在且为一个文件夹。

看到这里你可能觉得上面说的都很简单,可恰恰是简单的东西叠加组合就能“变出”很多你想要的结果,如何去使用这里面有大学问。对于 os.path 模块里的函数,如果我们可以充分利用,也能够实现很多有用的功能,下面来看几个例子:

1.获取 /root/rocky0429 目录下的所有文件

代码语言:javascript
复制
>>> import os
>>> [file for file in os.listdir(os.path.expanduser('~/rocky0429')) if os.path.isfile(file)]
['test.py', 'c.py', 'b.txt', 'a.txt']

2.获取 /root/rocky0429 目录下的所以列表

代码语言:javascript
复制
>>> import os
>>> [table for table in os.listdir(os.path.expanduser('~/rocky0429')) if os.path.isdir(table)]
['data', 'leey']

3.获取 /root/rocky0429 目录下所有目录的绝对地址

代码语言:javascript
复制
>>> import os
>>> {table: os.path.realpath(table) for table in os.listdir(os.path.expanduser('~/rocky0429')) if os.path.isdir(table)}
{'data': '/root/rocky0429/data', 'leey': '/root/rocky0429/leey'}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python空间 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档