Python3代码示例:文件目录操作

发布于:2018-02-09 | 分类:python/vba/cpp


python的os模块可以处理常见的文件/目录操作,此外还可能用到glob或者fnmatch模块匹配文件名。

常用方法

os.path.isdir(name) # 判断是不是一个目录
os.path.isfile(name) # 判断是不是一个文件
os.path.exists(name) # 判断是否存在文件或目录

os.path.abspath(name) # 获得绝对路径
os.path.realpath # 获取绝对路径
os.path.relpath() # 获取相对路径
os.path.normpath(path) # 规范path字符串表示

os.path.split(name) # 分割文件名与目录
os.path.splitext() # 分离文件名与扩展名
os.path.join(path,name) # 连接目录与文件名或目录

os.path.basename(path) # 返回文件名
os.path.dirname(path) # 返回文件路径
os.path.getsize(name) # 获得文件大小,目录返回0

os.listdir(dirname) # 列出dirname下的目录和文件
os.getcwd() # 获得当前工作目录
os.curdir # 返回当前目录('.')
os.chdir(dirname) # 改变工作目录到dirname
os.remove(name) # 删除文件
os.rename(src, dst) # 重命名文件
os.mkdir(dirname) # 创建目录
os.rmdir(dirname) # 删除目录
  • os.path.isdir(name)name参数应为绝对路径(e:\java);如果只是传入文件名(java),则在当前工作目录查找有没有同名文件夹
  • os.listdir(dirname)只返回文件名,需要结合os.path.join(path,name)拼接出绝对路径
  • os.path.realpath(name)获取绝对路径,该方法会将传入的文件名与当前工作目录拼接出绝对路径。如果要使用这个方法,必须先用os.chdir(dirname)改变当前工作目录。建议优先使用os.path.join(path,name)
  • os.path.relpath(name)获取相对路径,如果不传入命名关键字参数start,则根据当前工作目录计算相对路径,目录不同则报错

工作目录

os.getcwd()获取的是执行当前脚本的目录,并不一定的是脚本本身所在的目录。

# D:\program\TestSpace\test.py
import os
print(os.getcwd())

在不同目录执行以上脚本,可知工作目录的具体所指:

D:\program\TestSpace> python test.py
D:\program\TestSpace

D:\program> python TestSpace\test.py
D:\program

脚本目录

__file__返回当前脚本的路径,考虑到有时返回的是相对路径,故采用如下方式转换一下:

import os
os.path.dirname(os.path.abspath(__file__))

文件/目录列表

os.listdir(dirname)得到原始的目录文件列表,包括所有的文件、子目录、符号链接等,然后可以结合列表推导式和os.path模块中各函数来完成数据筛选。

import os

# 文件列表
filenames = [name for name in os.listdir('somedir') if os.path.isfile(os.path.join('somedir', name))]

# 目录列表
filenames = [name for name in os.listdir('somedir') if os.path.isdir(os.path.join('somedir', name))]

# 指定类型文件
pyfiles = [name for name in os.listdir('somedir') if name.endswith('.py')]

文件名筛选

简单的文件名匹配可以使用字符串判断方法,也可以使用glob或者fnmatch模块。

import glob
for name in glob.glob('somedir/*.py'):
    print(name)
from fnmatch import fnmatch
pyfiles = [name for name in os.listdir('somedir') if fnmatch(name, '*.py')]