• python基础学习:使用os模块批量移动文件


    最近想整理一下工作文件,但是之前写的用例和脚本放的位置比较杂,如果一个个找太麻烦了,所以写个脚本来处理,把它们都弄到一个文件里去

    本文介绍一下利用python批量把一个文件夹(及其子文件夹)下面的特定类型的文件移动到另一个文件夹下

    通过python操作系统目录及其文件,需要用到os包,本次具体用到如下方法

    os.walk(), 这个方法可以遍历一个文件夹及其子文件(子子文件夹等)

    os.rename(),这个方法用于命名文件或目录(因为是操作一个文件的绝对路径,所以其实相当于对文件进行剪切操作)

    另外也可以借助 shutil库对文件进行移动或复制操作

    下面是示例代码

    def run_main(source_dir, target_dir):
        num = 0
        for root, dirs, files in os.walk(source_dir, topdown=False):
            # root 表示当前正在访问的文件夹路径
            # dirs 表示该文件夹下的子目录名list
            # files 表示该文件夹下的文件list
            for name in files:
                # print(os.path.join(root, name))
                # print(type(os.path.join(root, name)))
                file = os.path.join(root, name)  # 拼接文件的完整路径(注意我们对一个文件或文件夹操作,一定要使用绝对路径)
                print(file)
                if file.split(".")[-1] in ["xls", "xlsx", "csv"]:  # 使用split判断获得的文件路径是不是以csv结尾
                    # print(file)
                    tar_file = file.split(".")[-2]+str(num)+"."+file.split(".")[-1] # 为了避免有重名文件,给原文件名后加一个递增序号num形成新的文件名
                    # print(target_dir+tar_file.split("\\")[-1])
                    if os.path.isfile(target_dir + tar_file.split("\\")[-1]): # 判断目标文件夹是否已存在该文件
                        print("已经存在该文件")
                    else:
                        print("正在移动第{}个文件:{}".format(num+1, tar_file.split("\\")[-1]))
                        os.rename(file, target_dir + tar_file.split("\\")[-1])
    
                    num += 1
    
    if __name__ == '__main__':
    
        run_main("D:/source/", "D:/target/")

    关于如何复制文件,还可以借助shutil,可以参考:https://www.jianshu.com/p/7846b6cbe4c8,内容如下

    将文件内容拷贝到另一个文件中
    
    1,import shutil
    
    2,shutil.copyfileobj(open('old.xml','r'), open('new.xml','w'))
    
    
    
    
    shutil.copyfile(src, dst)
    
    拷贝文件
    
    1,shutil.copyfile('f1.log','f2.log')#目标文件无需存在
    
    
    
    
    shutil.copymode(src, dst)
    
    仅拷贝权限。内容、组、用户均不变
    
    1,shutil.copymode('f1.log','f2.log')#目标文件必须存在
    
    
    
    
    shutil.copystat(src, dst)
    
    仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
    
    1,shutil.copystat('f1.log','f2.log')#目标文件必须存在
    
    
    
    
    shutil.copy(src, dst)
    
    拷贝文件和权限
    
    1,import shutil23shutil.copy('f1.log','f2.log')
    
    
    
    
    shutil.copy2(src, dst)
    
    拷贝文件和状态信息
    
    1,import shutil23shutil.copy2('f1.log','f2.log')
    
    
    
    
    shutil.ignore_patterns(*patterns) 基本用不到
    
    
    shutil.copytree(src, dst, symlinks=False, ignore=None)
    
    递归的去拷贝文件夹
    
    1,import shutil
    
    2,shutil.copytree('folder1','folder2', ignore=shutil.ignore_patterns('*.pyc','tmp*'))
    
    #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
    
    shutil.rmtree(path[, ignore_errors[, onerror]]) 
    
    递归的去删除文件
    
    1,import shutil
    2,shutil.rmtree('folder1')
    
    
    
    
    shutil.move(src, dst)
    
    递归的去移动文件,它类似mv命令,其实就是重命名。
    
    1,import shutil
    
    2,shutil.move('folder1','folder3')
    
    
    
    
    shutil.make_archive(base_name, format,...)
    
    创建压缩包并返回文件路径,例如:zip、tar
    
    创建压缩包并返回文件路径,例如:zip、tar
    
    base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
    
    如 data_bak                       =>保存至当前路径
    
    如:/tmp/data_bak =>保存至/tmp/
    
    format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
    
    root_dir: 要压缩的文件夹路径(默认当前目录)
    
    owner: 用户,默认当前用户
    
    group: 组,默认当前组
    
    logger: 用于记录日志,通常是logging.Logger对象
    
    
    #将 /data 下的文件打包放置当前程序目录
    
    import shutil
    
    ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data'#将 /data下的文件打包放置 /tmp/目录
    
    import shutil
    
    ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
    View Code

    其他传送门

    目前用到的一些os.path方法

    python相对目录的基本用法

  • 相关阅读:
    Careercup
    【LeetCode & 剑指offer刷题】树题1:二叉树的遍历总结(前序、中序、后序、层序、 之字形层序、垂直遍历)
    【LeetCode & 剑指offer刷题】链表题11:Palindrome Linked List
    【LeetCode & 剑指offer刷题】链表题9:Add Two Numbers
    【LeetCode & 剑指offer刷题】链表题10:328 Odd Even Linked List
    【LeetCode & 剑指offer刷题】链表题8:35 复杂链表的复制(138. Copy List with Random Pointer)
    【LeetCode & 剑指offer刷题】链表题6:23 有环链表问题-链表中环的入口结点(141. Linked List Cycle)
    【LeetCode & 剑指offer刷题】链表题7:25 合并两个排序的链表(系列)(21. Merge Two Sorted Lists)
    【LeetCode & 剑指offer刷题】链表题5:52 两个链表的第一个公共结点(Intersection of Two Linked Lists)
    【LeetCode & 剑指offer刷题】链表题4:22 删除链表中倒数第k个结点(19. Remove Nth Node From End of List)
  • 原文地址:https://www.cnblogs.com/hanmk/p/16095290.html
Copyright © 2020-2023  润新知