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"))

递归遍历目录下所有文件

https://www.cnblogs.com/dreamer-fish/p/3820625.html

方法一: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'])

返回结果说明:

  1. 返回的是一个三元 tupple(dirpath, dirnames, filenames)
  2. 其中第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件
  3. dirpath 是一个 string,代表目录的路径
  4. dirnames 是一个 list,包含了 dirpath 下所有子目录的名字
  5. 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

https://blog.csdn.net/hjxu2016/article/details/79455315

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']

截取路径中的文件名

https://blog.csdn.net/igolang/article/details/8021258

假设有一个文件的路径名为:“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 常见的路径名操作

https://docs.python.org/3/library/os.path.html

  • 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" 转载请保留原文链接及作者。

目录