Python中的os.path路径模块中的操作方法总结


Posted in Python onJuly 07, 2016

解析路径
路径解析依赖与os中定义的一些变量:

  • os.sep-路径各部分之间的分隔符。
  • os.extsep-文件名与文件扩展名之间的分隔符。
  • os.pardir-路径中表示目录树上一级的部分。
  • os.curdir-路径中当前目录的部分。

split()函数将路径分解为两个单独的部分,并返回包含这些结果的tuple。第二个元素是路径的最后部分,地一个元素是其他部分。

import os.path
for path in [ '/one/two/three',
        '/one/two/three/',
        '/',
        '.',
        '']:
  print '%15s : %s' % (path, os.path.split(path))

输入参数以os.sep结尾时,最后一个元素是空串。

输出:

/one/two/three : ('/one/two', 'three')
/one/two/three/ : ('/one/two/three', '')
       / : ('/', '')
       . : ('', '.')
        : ('', '')

basename()函数返回的值等价与split()值的第二部分。

import os.path
for path in [ '/one/two/three',
        '/one/two/three/',
        '/',
        '.',
        '']:
  print '%15s : %s' % (path, os.path.basename(path))

整个路径会剥除到只剩下最后一个元素。

输出:

/one/two/three : three
/one/two/three/ : 
       / : 
       . : .
        :

dirname()函数返回分解路径得到的第一部分。

import os.path
for path in [ '/one/two/three',
        '/one/two/three/',
        '/',
        '.',
        '']:
  print '%15s : %s' % (path, os.path.dirname(path))

将basename()与dirname()结合,得到原来的路径。

/one/two/three : /one/two
/one/two/three/ : /one/two/three
       / : /
       . : 
        :

splitext()作用类似与split(),不过它会根据扩展名分隔符而不是目录分隔符来分解路径。import os.path

for path in [ '/one.txt',
        '/one/two/three.txt',
        '/',
        '.',
        ''
        'two.tar.gz']:

  print '%21s : %s' % (path, os.path.splitext(path))

查找扩展名时,只使用os.extsep的最后一次出现。

/one.txt : ('/one', '.txt')
  /one/two/three.txt : ('/one/two/three', '.txt')
          / : ('/', '')
          . : ('.', '')
      two.tar.gz : ('two.tar', '.gz')

commonprefix()取一个路径列表作为参数,返回一个字符串,表示所有路径中出现的公共前缀。

import os.path
paths = [ '/one/two/three',
      '/one/two/threetxt',
      '/one/two/three/four',]
for path in paths:
  print 'PATH:', path

print
print 'PREFIX:', os.path.commonprefix(paths)

输出:

PATH: /one/two/three
PATH: /one/two/threetxt
PATH: /one/two/three/four

PREFIX: /one/two/three

建立路径
除了分解现有路径外,还需要从其他字符串建立路径,使用join()。

import os.path
for parts in [ ('one', 'two', 'three'),
      ('\one', 'two', 'three'),
      ('/one', '/two', '/three', '/four'),]:

  print parts, ':', os.path.join(*parts)

如果要连接的某个参数以os.sep开头,前面所有参数都会丢弃,参数会返回值的开始部分。

('one', 'two', 'three') : one\two\three
('\\one', 'two', 'three') : \one\two\three
('/one', '/two', '/three', '/four') : /four

规范化路径
使用join()或利用嵌入变量由单独的字符串组合路径时,得到的路径最后可能会有多余的分隔符或者相对路径部分,使用normpath()可以清除这些内容。

import os.path
for path in [ 'one/two/three',
       'one/./two/three',
       'one/../alt/two/three',
       ]:
  print '%20s : %s' % (path, os.path.normpath(path))

可以计算并压缩有os.curdir和os.pardir构成的路径段。

one/two/three : one\two\three
   one/./two/three : one\two\three
one/../alt/two/three : alt\two\three

要把一个相对路径转换为一个绝对文件名,可以使用abspath()。

import os.path
for path in [ '.',
       '..',
       'one/two/three',
       'one/./two/three',
       'one/../alt/two/three',
       ]:
  print '%20s : %s' % (path, os.path.abspath(path))

结果是从一个文件系统树最顶层开始的完整路径。

. : C:\Users\Administrator\Desktop
         .. : C:\Users\Administrator
    one/two/three : C:\Users\Administrator\Desktop\one\two\three
   one/./two/three : C:\Users\Administrator\Desktop\one\two\three
one/../alt/two/three : C:\Users\Administrator\Desktop\alt\two\three

文件时间

import os
import time
print 'File:', __file__
print 'Access time:', time.ctime(os.path.getatime(__file__))
print 'Modified time:', time.ctime(os.path.getmtime(__file__))
print 'Change time:', time.ctime(os.path.getctime(__time__))
print 'Size:', os.path.getsize(__file__)

返回访问时间,修改时间,创建时间,文件中的数据量。

测试文件
程序遇到一个路径名,通常需要知道这个路径的一些信息。

import os.path
filename = r'C:\Users\Administrator\Desktop\tmp'
print 'File    :', filename
print 'Is file?   :', os.path.isfile(filename)
print 'Absoulute  :', os.path.isabs(filename)
print 'Is dir?   :', os.path.isdir(filename)
print 'Is link?   :', os.path.islink(filename)
print 'Mountpoint? :', os.path.ismount(filename)
print 'Exists?    :', os.path.exists(filename)
print 'Link Exists? :', os.path.lexists(filename)

所有测试都返回布尔值。

File    : C:\Users\Administrator\Desktop\tmp
Is file?   : False
Absoulute  : True
Is dir?   : True
Is link?   : False
Mountpoint? : False
Exists?    : True
Link Exists? : True

遍历一个目录树

import os
import os.path
import pprint
def visit(arg, dirname, names):
  print dirname, arg
  for name in names:
    subname = os.path.join(dirname, name)
    if os.path.isdir(subname):
      print '%s/' % name 
    else:
      print ' %s' % name
  print
if not os.path.exists('example'):
  os.mkdir('example')
if not os.path.exists('example/one'):
  os.mkdir('example/one')
with open('example/one/file.txt', 'wt') as f:
  f.write('i love you')
with open('example/one/another.txt', 'wt') as f:
  f.write('i love you, two')
os.path.walk('example', visit, '(User data)')

会生成一个递归的目录列表。

example (User data)
one/

example\one (User data)
 another.txt
 file.txt

一些实际的用法合集:

#创建文件:
os.mknod("test.txt")    创建空文件
fp = open("test.txt",w)   直接打开一个文件,如果文件不存在则创建文件
 
#获取扩展名:
>>> os.path.splitext('/Volumes/Leopard/Users/Caroline/Desktop/1.mp4')[1:]
('.mp4',)
>>> os.path.splitext('/Volumes/Leopard/Users/Caroline/Desktop/1.mp4')[1]
'.mp4'
 
#获取文件名:
>>> print os.path.basename(r'/root/hahaha/123.txt')
123.txt
>>> print os.path.dirname(r'/root/hahaha/123.txt')
/root/hahaha
 
#判断目录或文件的存在:
>>> os.path.exists('/root/1.py')
True
>>> os.path.exists('/root/')
True
>>> os.path.exists('/root')
True
>>> os.path.isdir('/root')
True
 
#改变工作目录:
>>> os.chdir('/home')
>>> os.getcwd()
'/home'
 
#字符串分割:
>>> '/usr/bin/env'.split('/')
['', 'usr', 'bin', 'env']
 
#获取文件夹大小(Python2.x):
import os 
from os.path import join, getsize 
  
def getdirsize(dir): 
  size = 0L 
  for root, dirs, files in os.walk(dir): 
   size += sum([getsize(join(root, name)) for name in files]) 
  return size 
  
if __name__ == '__main__':
  filesize = getdirsize('/tmp') 
  print 'There are %.3f' % (filesize/1024/1024), 'Mbytes in /tmp' 
 
#获取文件夹大小(Python3.x):
import os 
from os.path import join, getsize 
  
def getdirsize(dir): 
  size = 0 
  for root, dirs, files in os.walk(dir): 
   size += sum([getsize(join(root, name)) for name in files]) 
  return size 
  
if __name__ == '__main__':
  filesize = getdirsize('/tmp') 
  print ('There are ' + str(filesize/1024/1024) + 'Mbytes in /tmp')
Python 相关文章推荐
Python发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
python判断windows系统是32位还是64位的方法
May 11 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
解决Mac下使用python的坑
Aug 13 Python
numpy求平均值的维度设定的例子
Aug 24 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
pytorch实现查看当前学习率
Jun 24 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
Pandas DataFrame求差集的示例代码
Dec 13 Python
python函数超时自动退出的实操方法
Dec 28 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
Python内置包对JSON文件数据进行编码和解码
Apr 12 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 #Python
Python的collections模块中的OrderedDict有序字典
Jul 07 #Python
Python的collections模块中namedtuple结构使用示例
Jul 07 #Python
详解Python的collections模块中的deque双端队列结构
Jul 07 #Python
简单掌握Python的Collections模块中counter结构的用法
Jul 07 #Python
Python处理json字符串转化为字典的简单实现
Jul 07 #Python
全面了解python字符串和字典
Jul 07 #Python
You might like
让你的网站首页自动选择语言转跳
2006/12/06 PHP
20个PHP常用类库小结
2011/09/11 PHP
三种php连接access数据库方法
2013/11/11 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
js实现小时钟效果
2020/03/25 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
西北政法大学自主招生自荐信
2014/01/29 职场文书
工程师岗位职责规定
2014/02/26 职场文书
仓库主管岗位职责
2014/03/02 职场文书
学生会部长竞聘书
2014/03/31 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
SQL语句多表联合查询的方法示例
2022/04/18 MySQL