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中的魔法方法深入理解
Jul 09 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
Python中单、双下划线的区别总结
Dec 01 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
python读取并写入mat文件的方法
Jul 12 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
python修改微信和支付宝步数的示例代码
Oct 12 Python
cookies应对python反爬虫知识点详解
Nov 25 Python
python实现控制台输出颜色
Mar 02 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
php 什么是PEAR?
2009/03/19 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php截取中文字符串函数实例
2015/02/23 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
Vue中图片Src使用变量的方法
2019/10/30 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
python中range()与xrange()用法分析
2016/09/21 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
python cs架构实现简单文件传输
2020/03/20 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
python 获取字典键值对的实现
2020/11/12 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
服务员自我评价
2014/01/25 职场文书
学校卫生检查制度
2014/02/03 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers