Python OS 模块文件目录常见操作
找到目录下最新的文件
https://blog.csdn.net/liudinglong1989/article/details/78731754
方法一:找到最新的文件或文件夹
def last_modify_file(path):
# 列出目录下所有的文件
file_list = os.listdir(path)
# 对文件修改时间进行升序排列
file_list.sort(key=lambda fn: os.path.getmtime(path + '\\' + fn))
# 获取最新修改时间的文件
filetime = datetime.datetime.fromtimestamp(os.path.getmtime(path + file_list[-1]))
# 获取文件所在目录
file_path = os.path.join(path, file_list[-1])
print("最新修改的文件(夹):" + file_list[-1])
print("时间:" + filetime.strftime('%Y-%m-%d %H-%M-%S'))
return file_path
# 返回最新文件或文件夹名:
print(last_modify_file("./"))
'''
key=lambda fn: os.path.getmtime(path + '\\' + fn)
类似于函数:
def key(fn):
return os.path.getmtime(path + '\\' + fn)
'''
方法二:找到最新的文件
file_dir = "./"
file_list = os.listdir(file_dir)
file_list.sort(key=lambda fn: os.path.getmtime(file_dir + fn) if not os.path.isdir(file_dir + fn) else 0)
'''
key=lambda fn: os.path.getmtime(file_dir + fn) if not os.path.isdir(file_dir + fn) else 0
类似于函数:
def mykey(fn):
if not os.path.isdir(file_dir + fn):
return os.path.getmtime(file_dir + fn)
else:
return 0
file_list.sort(key=mykey)
'''
# 获取文件时间
d = datetime.datetime.fromtimestamp(os.path.getmtime(file_dir + file_list[-1]))
print('最后改动的文件是' + file_list[-1] + ",时间:" + d.strftime("%Y-%m-%d %H-%M-%S"))
递归遍历目录下所有文件
方法一:os.listdir
def gci(filepath):
# 遍历filepath下所有文件,包括子目录
files = os.listdir(filepath)
for fi in files:
fi_d = os.path.join(filepath, fi)
if os.path.isdir(fi_d):
gci(fi_d)
else:
print(os.path.join(filepath, os.path.basename(fi_d))) # 不加 os.path.basename 的话,在传递相对路径时有错误
# 递归遍历目录下所有文件
gci('.' + os.sep)
方法二:os.walk
for fpathe, dirs, fs in os.walk('.' + os.sep):
for f in fs:
print (os.path.join(fpathe, f))
使用os.walk方法遍历:
import os
path="D:\\Temp_del\\a"
for i in os.walk(path):
print(i)
# 返回结果:
('D:\\Temp_del\\a', ['AFA', 'x64'], ['AudioFilterAgent.INI', 'Setup.exe'])
('D:\\Temp_del\\a\\AFA', ['222'], ['CAudioFilterAgent.exe', 'CAudioFilterAgent64.exe'])
('D:\\Temp_del\\a\\AFA\\222', [], ['新建日记本文档 - 副本.jnt', '新建日记本文档.jnt'])
('D:\\Temp_del\\a\\x64', ['bbb'], ['AudioFilterAgent.INI', 'setup64.exe'])
('D:\\Temp_del\\a\\x64\\bbb', [], ['CAudioFilterAgent.exe', 'CAudioFilterAgent64.exe'])
返回结果说明:
- 返回的是一个三元
tupple(dirpath, dirnames, filenames)
- 其中第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件
dirpath
是一个 string,代表目录的路径dirnames
是一个 list,包含了 dirpath 下所有子目录的名字filenames
是一个 list,包含了非目录文件的名字.这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name)
列出所有 .py 文件
os.path.splitext(path)
[i for i in os.listdir('.') if os.path.isfile(i) and os.path.splitext(i)[1] == '.py']
分隔文件路径和后缀名
>>> os.path.splitext('Test.py')
('Test', '.py')
>>> os.path.splitext('Test') # 不含后缀名
('Test', '')
glob
glob 模块是最简单的模块之一,内容非常少。用它可以查找符合特定规则的文件路径名。跟使用 windows 下的文件搜索差不多。
查找文件只用到三个匹配符:*
, ?
, []
。*
匹配 0 个或多个字符;?
匹配单个字符;[]
匹配指定范围内的字符,如:[0-9] 匹配数字。
import glob
WSI_MASK_PATH = '/home/jpg/' # 存放图片的文件夹路径
wsi_mask_paths = glob.glob(os.path.join(WSI_MASK_PATH, '*.py'))
wsi_mask_paths.sort()
# ['F:\\python\\JTest.py', 'F:\\python\\__init__.py', 'F:\\python\\lcheck.py', 'F:\\python\\t.py', 'F:\\python\\tTest.py']
截取路径中的文件名
假设有一个文件的路径名为:“K:\Project\FilterDriver\DriverCodes\hello.txt”,而且路径和文件名都不是固定的。如何得到 hello.txt 这段字符串呢?
字符串分割 split() 函数
path="K:/Project/FilterDriver/DriverCodes/hello.txt"
print (path.split("/")[-1])
执行结果:hello.txt。
使用 basename() 函数
import os.path
filePath = "K:/Project/FilterDriver/DriverCodes/hello.txt"
print (os.path.basename(filePath))
执行的结果仍然是 hello.txt。
简单实现同步文件夹操作
def synDir(from_dir, to_dir):
"""
同步文件夹 from_dir 下的内容到文件夹 to_dir 下
"""
if not os.path.exists(to_dir):
os.makedirs(to_dir)
for filename in os.listdir(from_dir):
fromfile = os.path.join(from_dir, filename)
tofile = os.path.join(to_dir, filename)
if os.path.isdir(fromfile):
synDir(fromfile, tofile)
else:
if not os.path.exists(tofile):
shutil.copy2(fromfile, tofile)
continue
if os.path.getsize(fromfile) != os.path.getsize(tofile):
shutil.copy2(fromfile, tofile)
OS 模块
https://my.oschina.net/cuffica/blog/33579
http://www.runoob.com/python3/python3-os-file-methods.html
- os.getcwd() # 获取当前工作目录,即当前 python 脚本工作的目录路径
- os.chdir("dirname") # 改变当前脚本工作目录到dirname
- os.curdir # 返回当前目录: ('.')
import os
os.getcwd() #输出'/Volumes/Leopard/Users/Caroline'
os.chdir('/Volumes')
os.getcwd() #输出'/Volumes'
os.curdir #输出"."
- os.makedirs() # 可生成多层递归目录
- os.removedirs() # 可删除多层递归空目录,若目录不为空则无法删除
- os.mkdir() # 生成单级目录
- os.rmdir() # 删除单级空目录,若目录不为空则无法删除,报错
- os.pardir() # 获取当前目录的父目录字符串名
- os.listdir() # 列出指定目录下的所有文件和子目录,包括隐藏文件
- os.remove() # 删除一个文件
- os.unlink() # 同 os.remove()
- os.rename("oldname","newname") # 重命名文件
- os.sep # 输出操作系统特定的路径分隔符。win下为"\",macx下为"/"
- os.linesep # 输出当前平台使用的行终止符
- os.pathsep # 输出用于分割文件路径的字符串
- os.name # 输出字符串指示当前使用平台。win->'nt'; mac->'posix'
- os.environ # 获取系统环境变量
import os
os.sep # 路径名中的分隔符,Linux:"/",Windows:"\"
os.altsep # 可选的路径分隔符,Windows:"/",Linux 无结果
os.linesep # 文本文件字符串分隔符,"\n","\r\n"
os.pathsep # Linux 输出":",Windows 下 ";"
os.environ # 输出{'LANG': 'en_US.UTF-8', 'TERM': 'xterm-color', 'Apple_PubSub_Socket_Render': '/tmp/launch-cQd0wl/Render', 'VERSIONER_PYTHON_PREFER_32_BIT': 'no', 'VERSIONER_PYTHON_VERSION': '2.6', 'SHLVL': '1', 'SSH_AUTH_SOCK': '/tmp/launch-Wd5ZJI/Listeners', 'TERM_PROGRAM_VERSION': '273', '__CF_USER_TEXT_ENCODING': '0x1F5:0:0', 'PWD': '/Volumes/Leopard/Users/Caroline', 'SHELL': '/bin/bash', 'LOGNAME': 'Caroline', 'USER': 'Caroline', 'HOME': '/Volumes/Leopard/Users/Caroline', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin', 'COMMAND_MODE': 'unix2003', '_': '/usr/bin/python', 'DISPLAY': '/tmp/launch-VIFSmk/org.x:0', 'TMPDIR': '/var/folders/Iy/IyQx9l7EHD0y+Z77k20XCU+++TI/-Tmp-/', 'TERM_PROGRAM': 'Apple_Terminal'}
os.environ.get('LOGNAME') # 输出'Caroline'
- os.system(command) # 运行 shell 命令
# 打开一个浏览器
>>> os.system(r'"C:\Program Files (x86)\Google\chrome.exe"') # 注意引号""
0
# windows下特有函数
os.startfile(r'"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"')
# 更好的解决方案
>>> import webbrowser
>>> webbrowser.open('http://baidu.com')
True
os.symlink(src, dst) # 创建一个软链接
os.symlink('D:\\src', 'D:\\symlink')
,需要管理员权限os.link(src, dst) # 创建硬链接
os.link('D:\\a.jpg', 'D:\\link.jpg')
os.utime() # 方法用于设置指定路径文件最后的修改和访问时间。
os.utime('D:\\aaa.jpg', (1330712280, 1330712292))
os.stat(path, *, dir_fd=None, follow_symlinks=True)
获取文件或文件描述符的状态。返回一个 stat_result 对象。
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
os.stat_result(st_mode=33206, st_ino=10414574138694179, st_dev=504226, st_nlink=1, st_uid=0, st_gid=0, st_size=310, st_atime=1548311651, st_mtime=1548311651, st_ctime=1548311651)
>>> statinfo.st_size
310
class os.stat_result
对象的属性大致对应于 stat 结构的成员。它用于 os.stat(),os.fstat() 和 os.lstat() 的结果。
- st_size:文件大小(以字节为单位),如果是常规文件或符号链接。符号链接的大小是它所包含的路径名的长度,而不是终止的空字节。
- st_atime:最近访问的时间以秒表示。
- st_mtime:最近的内容修改时间以秒表示。
- st_ctime:取决于平台:Unix 上最新的元数据更改时间,在 Windows 上创建的时间,以秒表示。
os.path 常见的路径名操作
os.path.abspath(path) # 返回 path 规范化的绝对路径。
os.path.basename(path) # 返回路径名路径的基本名称,'D:\test.txt',返回:'test.txt'
os.path.commonpath(paths) # 获取共同路径
os.path.commonprefix(list) # 返回列表中所有路径的前缀的最长路径前缀
# 上面两个函数的区别
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
- os.path.dirname(path) # 获取文件夹名,和 os.path.basename(path) 相反,'D:\test.txt','D:\'
- os.path.exists(path) # 判断路径或文件是否存在
获取文件相关信息
- os.path.getatime(path) # 最后访问时间,等同于 os.stat(path).st_atime
- os.path.getmtime(path) # 最后修改时间,等同于 os.stat(path).st_mtime
- os.path.getctime(path) # 取决于平台:Unix上最新的元数据更改时间,在Windows上创建的时间,以秒表示。,等同于 os.stat(path).st_ctime
- os.path.getsize(path) # 文件大小(字节),等同于 os.stat(path).st_size
对于路径的判断
- os.path.isabs(path) # 是否为绝对路径
- os.path.isfile(path) # 是否文件
- os.path.isdir(path) # 是否文件夹
- os.path.islink(path) # 如果 path 引用作为符号链接的现有目录条目(软连接),则返回 True。如果 Python 运行时不支持符号链接,则始终为 False。
- os.path.ismount(path) # 如果路径名路径是装入点(挂载),则返回 True。
- os.path.samefile(path1, path2) # 如果两个路径名参数都引用相同的文件或目录,则返回 True。
范化路径名
- os.path.join(path, *paths)
- os.path.normcase(path) # 规范化路径名的大小写。在 Unix 和 Mac OS X 上,这将返回路径不变;在 Windows 上,它还将正斜杠转换为反斜杠。
- os.path.normpath(path) # 通过折叠冗余分隔符和上级引用来规范化路径名,
A//B
,A/B/
,A/./B
,A/foo/../B
都变为A/B
。
相对路径
- os.path.relpath(path, start=os.curdir) # 如何从 start 到达 path
路径分隔
os.path.split(path) #从文件与文件夹分隔
os.path.splitdrive(path) #从卷分隔
os.path.splitext(path) #将文件后缀分隔
>>> os.path.split(r'D:\test\data\1 (1).jpg')
('D:\\test\\data\', '1 (1).jpg')
>>> os.path.splitdrive(r'D:\test\data\1 (1).jpg')
('D:', '\\test\\data\\\1 (1).jpg')
>>> os.path.splitext(r'D:\test\data\1 (1).jpg')
('D:\\test\\data\\\1 (1)', '.jpg')
# linux 下
# e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir")
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:Python OS 模块文件目录常见操作
文章字数:2.8k
本文作者:Bin
发布时间:2018-09-30, 16:06:22
最后更新:2019-08-06, 00:07:35
原始链接:http://coolview.github.io/2018/09/30/Python/Python%20OS%20%E6%A8%A1%E5%9D%97%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E5%B8%B8%E8%A7%81%E6%93%8D%E4%BD%9C/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。