2018/9/10--Python学习笔记(三)-- 组织文件

开篇的话:不明白为什么这一个章节会去这么个名字,这篇笔记的末尾,我会结合自己电脑里一堆文件的实际需求写一个小脚本


shutil模块

复制文件和文件夹

        调用shutil.copy(source, destination),将路径source 处的文件复制到路径destination处的文件夹(source 和 destination 都是字符串)。如果 destination 是一个文件名,它将作为被复制文件的新名字。该函数返回一个字符串,表示被复制文件的路径。

import shutil

shutil.copy('C:\\Users\\81045\\Desktop\\haha.txt', 'D:\\')

# 将桌面的haha文件复制到D盘

shutil.copy('C:\\Users\\81045\\Desktop\\haha.txt', 'D:\\xixi.txt')

# 将桌面的haha文件复制到D盘,并重命名为xixi.txt

        shutil.copytree()将复制整个文件夹,以及它包含的文件夹和文件。调用 shutil.copytree(source, destination),将路径 source 处的文件夹,包括它的所有文件和子文件夹,复制到路径 destination 处的文件夹。source 和destination 参数都是字符串。该函数返回一个字符串,是新复制的文件夹的路径。

import shutil

shutil.copytree('C:\\Users\\81045\\Desktop\\haha', 'D:\\xixi')

# 将桌面上haha文件夹,复制到D盘,如果xixi不存在,则会创建一个新的文件夹

文件和文件夹的移动与改名

        调用 shutil.move(source, destination),将路径 source 处的文件夹移动到路径destination,并返回新位置的绝对路径的字符串。如果 destination 指向一个文件夹,source 文件将移动到 destination 中,并保持原来的文件名。

import shutil

shutil.move('C:\\Users\\81045\\Desktop\\haha.txt', 'D:\\')

# 将桌面的haha文件移动到D盘

shutil.move('C:\\Users\\81045\\Desktop\\haha.txt', 'D:\\xixi.txt')

# 将桌面的haha文件移动到D盘,并改名为xixi.txt

永久删除文件和文件夹

        利用 os 模块中的函数,可以删除一个文件或一个空文件夹。但利用 shutil 模块,可以删除一个文件夹及其所有的内容。

  • 用 os.unlink(path)将删除 path 处的文件。
  • 调用 os.rmdir(path)将删除 path 处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
  • 调用 shutil.rmtree(path)将删除 path 处的文件夹,它包含的所有文件和文件夹都会被删除。

在程序中使用这些函数时要小心!可以第一次运行程序时,注释掉这些调用,并且加上 print()调用,显示会被删除的文件。

import os

for filename in os.listdir('D:\\haha'):
    
    if filename.endswith('.txt'):

        #os.unlink(filename)
        print(filename)

#   删除D盘haha文件夹中所有txt文件

用 send2trash 模块安全地删除

        删除文件和文件夹的更好方法,是使用第三方的 send2trash 模块。你可以在终端窗口中运行 pip install send2trash,安装该模块。

        利用 send2trash,比 Python 常规的删除函数要安全得多,因为它会将文件夹和文件发送到计算机的垃圾箱或回收站,而不是永久删除它们。如果因程序缺陷而用send2trash 删除了某些你不想删除的东西,稍后可以从垃圾箱恢复。

import send2trash

send2trash.sen2trash('D:\\haha.txt')

#  将D盘haha.txt放入回收站

遍历目录树

        你希望遍历目录树,处理遇到的每个文件。Python 提供了一个函数,替你处理这个过程。

        os.walk()函数被传入一个字符串值,即一个文件夹的路径。你可以在一个 for循环语句中使用 os.walk()函数,遍历目录树,就像使用 range()函数遍历一个范围的数字一样。不像 range(),os.walk()在循环的每次迭代中,返回 3 个值:

  1. 当前文件夹名称的字符串。
  2. 当前文件夹中子文件夹的字符串的列表
  3. 当前文件夹中文件的字符串的列表

所谓当前文件夹,是指 for 循环当前迭代的文件夹。程序的当前工作目录,不会因为 os.walk()而改变。

#   书上例子

import os

for folderName, subfolders, filenames in os.walk('C:\\delicious'):

    print('The current folder is ' + folderName)

    for subfolder in subfolders:

        print('SUBFOLDER OF ' + folderName + ': ' + subfolder)

    for filename in filenames:

        print('FILE INSIDE ' + folderName + ': '+ filename)



#   输出结果
#The current folder is C:\delicious
#SUBFOLDER OF C:\delicious: cats
#SUBFOLDER OF C:\delicious: walnut
#FILE INSIDE C:\delicious: spam.txt
#The current folder is C:\delicious\cats
#FILE INSIDE C:\delicious\cats: catnames.txt
#FILE INSIDE C:\delicious\cats: zophie.jpg
#The current folder is C:\delicious\walnut
#SUBFOLDER OF C:\delicious\walnut: waffles
#The current folder is C:\delicious\walnut\waffles
#FILE INSIDE C:\delicious\walnut\waffles: butter.txt.

OK,现在来介绍我自己做的一个小练习

在我的移动硬盘里有一堆家具模型,我想要把他们每个模型的预览图都整理出来,要排除掉贴图文件,和一些其他乱七八糟的图片。

2018/9/10--Python学习笔记(三)-- 组织文件_第1张图片

类似上图中54.jpg(当然这个只是命名比较简单的一个),我会在每个大集合的文件夹下创建一个“预览”文件夹,来存放我重新命名的图片

import os, re, shutil

# 创建正则表达式匹配  .jpg   文件,只包含模型缩略图不包含贴图
jpgRegex1 = re.compile(r'''
    ^((\d{1,3}))
    (.*?)
    (.jpg)$
''', re.VERBOSE)

jpgRegex2 = re.compile(r'''
    ^(([A-Za-z])+)
    (\_)
    (\d{3})
    ((\_\d{3})|\_([a-z])+\d{3})?
    (.jpg)$
''', re.VERBOSE)

# 文件夹路径
mainPath = 'J:\\***********\\各种各样风格的家具 大集合'

# 创建预览图 
def createJpg(mainPath):

    for i in range(len(os.listdir(mainPath))):   #遍历mainPath目录下的文件夹

        jpgPath = mainPath + '\\' + str(i+1)

        dirPath = jpgPath + '\\预览'

        print('----------------------------------------创建 预览 文件夹' + dirPath + '--------------------------------------------')
        os.makedirs(dirPath)   # 创建空的  预览  文件夹
        
        # 遍历所有文件进行筛选
        for folderName, subfolders, filenames in os.walk(jpgPath):
            
            # 如果要遍历的文件夹是 预览 文件夹则跳过
            if os.path.basename(folderName) == '预览':
                continue

            # 遍历文件名,并通过两个正则表达式来判断
            for filename in filenames:

                mo1 = jpgRegex1.search(filename)

                mo2 = jpgRegex2.search(filename)

                if mo1 == None:
                    if mo2 == None:
                        continue

                # 命名新的文件名
                # newfilename = os.path.basename(folderName) + '_' + filename
                newfilename = os.path.basename(folderName) + '.jpg'

                print(os.path.join(folderName, filename) + '--------------------->' + os.path.join(dirPath, newfilename))
                shutil.copy(os.path.join(folderName, filename), os.path.join(dirPath, newfilename)) # 执行 copy 

def deleteYuLan(mainPath):

    for i in range(1,12):
        
        # 需要删除的文件夹的路径
        deletePath = os.path.join(mainPath, str(i), '预览')

        print(deletePath)

        # 
        shutil.rmtree(deletePath)

    print('Delete complete!')



createJpg(mainPath)
#deleteYuLan(mainPath)

为了测试,我还写了一个删除预览文件夹的函数,这样可以方便我每次运行完create之后发现有错误,便于删除。

你可能感兴趣的:(Python)