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 01 Python
详解Python中for循环的使用方法
May 14 Python
Python去除字符串两端空格的方法
May 21 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
python实现BackPropagation算法
Dec 14 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
Python json转字典字符方法实例解析
Apr 13 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
德生H-501的评价与改造
2021/03/02 无线电
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
禁止你的左键复制实用技巧
2013/01/04 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
Python 探针的实现原理
2016/04/23 Python
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
对pandas处理json数据的方法详解
2019/02/08 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
Python range与enumerate函数区别解析
2020/02/28 Python
python中数据库like模糊查询方式
2020/03/02 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
python selenium操作cookie的实现
2020/03/18 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
新手学python应该下哪个版本
2020/06/11 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
python excel和yaml文件的读取封装
2021/01/12 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
网站域名和主机:Domain.com
2019/04/01 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
创业计划书——互联网商机
2014/01/12 职场文书
高中生军训感言
2015/08/01 职场文书