zoukankan      html  css  js  c++  java
  • python文件操作glob_os_等对比

    Python标准库glob介绍

    一、 glob模块通配符

    通配符功能

    *

    匹配0或多个字符

    **

    匹配所有文件,目录,子目录和子目录里面的文件 (3.5版本新增)

    匹配一个字符,这里与正则表达式? (正则?匹配前面表达式0次或者1次)

    []

    匹配指定范围内的字符,如: [1-9]匹配1至9内的字符

    [!]

    匹配不在指定范围内的字符

    1、通配符

    星号(*)匹配零个或多个字符

    import glob
    for name in glob.glob('dir/*'):
        print (name)
    dir/file.txt
    dir/file1.txt
    dir/file2.txt
    dir/filea.txt
    dir/fileb.txt
    dir/subdir

    列出子目录中的文件,必须在模式中包括子目录名:

    import glob
    
    #用子目录查询文件
    print ('Named explicitly:')
    for name in glob.glob('dir/subdir/*'):
        print ('	', name)
    #用通配符* 代替子目录名
    print ('Named with wildcard:')
    for name in glob.glob('dir/*/*'):
        print ('	', name)
    Named explicitly:
            dir/subdir/subfile.txt
    Named with wildcard:
            dir/subdir/subfile.txt

    2、单个字符通配符

    用问号(?)匹配任何单个的字符。

    import glob
    
    for name in glob.glob('dir/file?.txt'):
        print (name)
    dir/file1.txt
    dir/file2.txt
    dir/filea.txt
    dir/fileb.txt

    3、字符范围

    当需要匹配一个特定的字符,可以使用一个范围

    import glob
    for name in glob.glob('dir/*[0-9].*'):
        print (name)
    dir/file1.txt
    dir/file2.txt

    二、glob模块iglob 返回iterator执行效率更高

    1.当前路径文件tmp下py文件,使用iglob,返回迭代器效率更高

    for fname in glob.iglob("./tmp/*.py"):
        print(fname)

    三、其他

    1.转移字符

    specials = '?*['
    
    for char in specials:
        pattern = '**/*' + glob.escape(char) + '.txt'
        print('Searching for: {!r}'.format(pattern))
        for name in sorted(glob.glob(pattern,recursive=True)):
            print(name)
        print()

     

    Python标准库OS介绍

    os模块的常见功能

    os模块自带的文件和文件夹操作方法都非常有用。

    • 得到当前工作目录的路径: os.getcwd()

    • 改变当前工作目录: os.chdir(path)

    • 返回指定目录下的所有文件和目录名:os.listdir(path)

    • 函数用来删除一个文件:os.remove(path)和os.unlink(path)

    • 检验给出的路径是否是一个文件:os.path.isfile(path)

    • 检验给出的路径是否是一个目录:os.path.isdir(path)

    • 判断是否是绝对路径:os.path.isabs()

    • 检查是否快捷方式os.path.islink (filename )

    • 检验给出的路径是否真地存在:os.path.exists(path)

    • 返回一个路径的目录名和文件名:os.path.split() eg os.path.split('/home/python/django.html') 结果:('/home/python', 'django.html')

    • 拼接工作路径: os.path.join(str1, str2, str3..)

    • 分离扩展名:os.path.splitext()

    • 获取路径名:os.path.dirname(path)

    • 获取文件名:os.path.basename()

    • 运行shell命令: os.system()

    • 读取和设置环境变量:os.getenv() 与os.putenv()

    • 给出当前平台使用的行终止符:os.linesep Windows使用' ',Linux使用' '而Mac使用' '

    • 指示你正在使用的平台:os.name 对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'

    • 重命名:os.rename(old, new)

    • 创建多级目录:os.makedirs(r“c:python est”)

    • 创建单个目录:os.mkdir(“test”)

    • 删除单个目录: os.rmdir(“test"

    • 删除多个目录:os.removedirs(r“c:folder”)

    • 获取文件属性:os.stat()

    • 修改文件权限与时间戳:os.chmod()

    • 终止当前进程:os.exit()

    • 获取文件大小:os.path.getsize(filename)

    值得注意的是windows和Linux采用了不同的路径分隔符(“/”和""。我最喜欢的方法是os.path.join方法,提高了我们代码可移植性。比如下面代码:

    os.path.join("python", "django", "some.py")
    • 在windows下返回pythondjangosome.py

    • 在linux下返回python/django/some.py

    我们接下来看几个利用os模块操作文件的实际案例。

    查找某个目录下的全部txt文件并删除。

    假设我们在当前工作目录下有个叫tutorial的文件夹,我们要把里面的txt文件,删除,我们可以这么做:

    >>> import os
    >>> os.getcwd() # 获取当前工作目录
    'C:\Users\MissEnka\Python'
    >>> os.listdir('tutorial') # 查看tutorial文件夹
    ['notes.txt', 'pdf docs', 'txtfiles']
    >>> for filename in os.listdir('tutorial'):
        if filename.endswith('.txt'):
            os.remove(os.path.join('tutorial', filename))
            print("{} deleted.".format(filename))
    
    notes.txt deleted.

    上段代码有2点需要你注意的地方,你发现没有?

    • 我们只删除了tutorial文件下的notes.txt文件,并没有删除子文件夹txtfiles里的.txt文件。想要遍历一个文件夹,查找所有目录包括子目录的文件,我们需要用到下面会提到的os.walk()方法。

    • 我们用的os.remove(os.path.join("tutorial"), filename))而不是简单用os.remove(filename)来删除文件,这是因为notes.txt相对于当前工作目录的路径是/tutorial/notes.txt, 而不是notes.txt。

    使用os.walk()遍历一个文件夹子目录查找所有txt文件并删除

    >>> for foldName, subfolders, filenames in os.walk('tutorial'):
        for filename in filenames:
          if filename.endswith('.txt'):
             os.remove(os.path.join(foldName, filename))
             print("{} deleted.".format(filename))

    用os.walk()打印出某个文件夹下所有子目录和文件名称方法如下。来源: Automate the boring stuff with Python。

    import os
    folderName, subfolders, filenames in os.walk('directory'):
        print('The current folder is ' + folderName)
    
        for subfolder in subfolders:
            print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
        for filename in filenames:
            print('FILE INSIDE ' + folderName + ': '+ filename)
    
        print('')

    利用shutil模块复制和移动文件

    shutil模块可以用来复制和移动一个文件。shutil.copy()用来复制文件,第一个参数是需要复制的文件,第二个参数可以是文件夹,也可以是个文件名。如果是文件夹,新文件将存储在新文件夹里,文件名不变。如果是文件名,则新文件直接以文件名命名。shutil.copyfile()与shutil.copy()类似,只不过2个参数都必需是文件名。

    >> import shutil
    >> import os
    >> os.chdir('C:\')
    >> shutil.copy('C:\spam.txt', 'C:\delicious')
    'C:\delicious\spam.txt'
    >> shutil.copy('eggs.txt', 'C:\delicious\eggs2.txt')
    'C:\delicious\eggs2.txt'

    shutil还常用来复制文件夹或移动文件,代码如下:

    # 复制文件夹. olddir和newdir都只能是目录,且newdir必须不存在
    shutil.copytree("老目录", "新目录")
    
    # 移动文件(目录)
    shutil.move("老位置", "新位置") 

    参考博客

    https://www.jianshu.com/p/05e5cebbc55e

    https://www.jianshu.com/p/32e3364b22ee

    https://blog.csdn.net/weixin_42134789/article/details/80362826

  • 相关阅读:
    Oracle数据库死锁和MySQL死锁构造和比较
    shell单引号中输出参数值
    视频流媒体服务器
    使用syncthing进行双机文件同步
    状态(State)模式--设计模式
    中介者(调停者)模式--设计模式
    链表的中间节点
    删除链表中的倒数第N个节点
    Logos讲解--逆向开发
    MonkeyDev安装--逆向开发
  • 原文地址:https://www.cnblogs.com/kongweisi/p/12114191.html
Copyright © 2011-2022 走看看