本次实验主要介绍了如何利用Python相关库处理文件和目录,以达到快速提升办公效率的目的。内容包括但不限于:
完成本实验后,您将能够
本次任务主要了解os库常见的文件和目录操作方法,并通过实例进行演示,通过对这些内容的学习掌握可以有效的提升关于文件和目录管理方面的办公效率。
os 库是Python标准库,随Python一起安装,无须单独安装。os 是 operation system (操作系统) 的缩写。os 库提供了各种操作系统功能的接口。os 库中包含很多操作文件和目录的函数,可以方便的实现文件的重命名,添加或删除目录,复制文件/目录等操作。
导入os库,快速查看它有哪些类、属性和函数:
import os
print(dir(os))
其中常见的函数如下:
使用 os.path 可以调用 ntpath.py 模板,可以通过 dir 函数查看该模块包含的类、属性和函数:
import os
print(dir(os.path))
其中较常见的操作函数有:
进入平台,打开 pycharm, 打开 main.py 文件,清空文件内容 。
示例-1:
import os
print(os.getcwd())
示例-2:
import os
os.chdir('c:\windows')
print(os.getcwd())
示例-3:
可以通过os.listdir() 方法获取目录下面的文件。
import os
files = os.listdir(r'c:\soft\code')
for file in files:
print(file)
import os
list = []
for file in os.listdir('./'):
if file.endswith('.py'):
list.append(file)
print(list)
os.listdir() 方法不能获取子目录里面的文件,要想获取里面的文件,则需要用到os.walk方法。
示例-4:
下面是常用的遍历一个文件夹的代码,它可以列出文件夹及其子目录的所有文件
import os
path = r'c:\soft\code'
for foldName,subfolder,filenames in os.walk(path):
for filename in filenames:
print(foldName,filename)
可以利用 os.path.join 方法来拼接文件的绝对路径,如上例可重构为:
import os
path = r'c:\soft\code'
for foldName,subfolder,filenames in os.walk(path):
for filename in filenames:
print(os.path.join(foldName,filename))
操作文件目录时,常常需要对路径进行拆分组合。
下面对一个绝对路径文件名进行拆分:
示例-5
import os
path = r'c:\soft\code\main.py'
print(os.path.split(path)) # 折分文件为:路径和文件名
print(os.path.dirname(path)) # 得到路径
print(os.path.basename(path)) # 得到文件名
print(os.path.splitext(path)) # 拆分文件为路径+文件名,以及后缀名
我们遍历文件夹,可以获取全部文件的属性,基于属性能更加精确地筛选和管理文件,例如根据文件大小、创建时间来分类管理文件。这里是获取文件的一般属性,对于特殊自的文件(如照片),我们还可以用专门的模块来获取更多文件信息,例如地理位置经纬度等。我们可以将分散在不同文件夹的照片找出来,然后根据拍摄地点分类管理照片。
os.path 模块也包含若干函数,用于获取文件的属性,包括文件的创建时间、修改时间,文件的大小等。
如:
import os
import time
file= r'c:\soft\code\main.py'
os.path.getatime(file) #输出最近访问时间(得到的是时间戳)
os.path.getctime(file) #输出文件创建时间(得到的是时间戳)
os.path.getmtime(file) #输出最近修改时间(得到的是时间戳)
time.gmtime(os.path.getmtime(file)) #以struct_time形式输出最近修改时间
time.ctime(os.path.getctime(file)) # 换算成标准的日期时间
os.path.getsize(file) #输出文件大小(字节为单位)
在实际的工作中,在我们的电脑中会存在许多无用的垃圾小文件,这些文件的特征就是特别小,甚至于是空白文件。但是其中有些文件是TXT文档,本身就比较小。所以,我们需要找出其中不是TXT文档且小于2000字节的文件,通过如下代码实现批量删除。
import os
for file in os.listdir(r'./dir1'):
path = os.path.abspath(path)
filename = os.path.join(path, file)
if os.path.isfile(filename):
filesize = os.path.getsize(filename)
if (filesize<2000) & (os.path.splitext(file)[-1]!='.txt'):
os.remove(filename)
扩展:删除所有包含子目录下面的小文件
for foldName,subfolder,filenames in os.walk(path):
for filename in filenames:
myfile = os.path.join(foldName,filename)
filesize = os.path.getsize(myfile)
if (filesize<2000) & (os.path.splitext(myfile)[-1]!='.txt'):
os.remove(myfile)
下面对文件夹里的所有文件更名,在文件名的后面加上当前系统时间。
将某目录下所有的文件(包含子目录)全部更名为 文件(时间时间戳)的方式进行重命名操作。此种行为在日志生成中,或订单号码生成中很常用。
import os
import datetime
path = r'./dir1'
# 构造一个由年月日时分秒构成的字符串,将来用于改名
curr_time = datetime.datetime.strftime(datetime.datetime.now(),'%Y%m%d%H%M%S')
# 遍历path目录下所有的文件,用于更名
for foldName,subfolders,filenames in os.walk(path):
for filename in filenames: # 只遍历文件
# 得到每个文件的绝对路径文件名
abspath = os.path.join(foldname,filename)
# 得到源文件除后缀之外的文件名
source_name = os.path.splitext(filename)[0]
# 构造新的文件名:如:原文件名为a.txt ---> a(20210929112021).txt
new_name = filename.replace(source_name,'{0}({1})'.format(source_name,curr_time))
# 进行重命名操作
os.rename(abspath,os.path.join(foldname,new_name))
glob()函数可以将某目录下所有跟通配符模式相同的文件放到一个列表中,有了这个函数,我们再想生成所有文件的列表就不需要使用for循环遍历目录了,直接使用glob.glob(path+pattern)的方式获取,举个例子:
以下代码是过滤出当前目录下所有 .py
文件
import glob
pyList = glob.glob('./*.py')
print(pyList)
import glob
# 获取指定目录下的所有图片
print (glob.glob(r"/home/qiaoyunhao/*/*.png"),"\n") # 加上r让字符串不转义
# 获取上级目录的所有.py文件
print (glob.glob(r'../*.py')) # 相对路径
利用glob查找文件可以使用三个匹配符:*, ?, []
*
匹配0个或多个字符;?
匹配单个字符;[]
匹配指定范围内的字符,如:[0-9]匹配数,如以下代码是查找所有以数字开始和数字结束的 py 文件
import glob
list = glob.glob(r'c:/test/[0-9]*[0-9].py')
print(list)
原始目录及内容如下:
本次任务主要讲解了如何利用shutil库来进行文件的管理,包括但不限于文件复制、移动、压缩、解压缩等功能。
shutil库也是Python标准库,它可以处理文件、文件夹、压缩包,能实现文件复制、移动、压缩、解压缩等功能。利用它能够更加简单方便的完成对文件和目录的管理 ,从而更加高效的完成工作中的办公自动化相关的文件管理工作。
1)首先,导入shutil库并查看该库包含的类、函数。
import shutil
dir(shutil)
利用shutil库复制文件有三种方法(copyfile、copy、copy2),三种方法的区别如下:
示例-1:
import shutil
shutil.copyfile(r'./main.py',r'c:/test/a.py')
shutil.copy(r'./main.py',r'c:/test')
可以利用shutil.copytree(A,B)方法将A目录及其内部的文件一起复制到B目录中,如:
import shutil
shutil.copytree(r'c:/test','./test')
注意:利用copytree复制A目录到B目标文件夹时,目标文件夹B必须不允许事先存在,如果存在的话,则会报错。
可以利用shutil.move 方法实现文件的移动,如:
import shutil
shutil.move(r'c:\test\a.txt',r'./')
还可以整体移动目录,如:
import shutil
shutil.move(r'c:\test',r'./')
shutil.rmtree 方法可以删除整个目录,如
shutil.rmtree(r'c:\test')
特别说明:
(1)使用 os.unlink
方法可以删除单个文件
(2)使用 os.rmdir
方法和 os.removedirs
方法都要求被删除的目录为空,否则会报错
(3)而 shutil.rmtree
方法则不管目录是否为空,都会删除
本次任务主要讲解了如何利用zipfile和rarfile进行文件的压缩与解压缩。
压缩包对于文件管理非常有用。例如:有时需要定期将某个目录进行打包存档,按照时间存档,形成完善的电子档案,有时压缩文件也是为了减少文件的大小,或发送上传更加方便。
1)zip 类型的压缩与解压缩
(1)压缩
可以使用 shutil.make_archive方法实现文件的压缩。
shutil.make_archive(base_name, format, base_dir)
base_name ---> 创建的目标文件名,包括路径,减去任何特定格式的扩展
format ---> 压缩包格式后缀:zip、tar、bztar、gztar
base_dir ---> 开始打包的路径
返回值:返回打包文件的绝对路径和名称
如下面的代码就是将c:\test目录及其目录打包成my.zip:
import shutil
shutil.make_archive('my','zip',r'c:\test')
再如如下代码实现,将当前目录下所有文件压缩到c:\mytest目录下,并重命名为:压缩包.zip
import shutil
shutil.make_archive(r'c:\mytest\压缩包','zip',r'./')
(2)解压
解压也非常简单,将压缩包解压到指定的文件夹(可新建)内即可。
可以使用 shutil.unpack_archive 方法实现解压。
shutil.unpack_archive(filename, extract_dir)
filename ---> 需要解包的文件,需要写明文件的后缀
extract_dir ---> 解包后文件存放位置
返回值:None
如:将上例的压缩包解压到 c:\unpack目录下
import shutil
shutil.unpack_archive(r'c:\mytest\压缩包.zip', r'c:\unpack')
(1)zipfile包简介
可以利用 zipfile 进行 zip 文件的高级管理。需要导入模块 import zipfile
import zipfile
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
(1)参数file表示文件的路径或类文件对象(file-like object);
(2)参数mode指示打开zip文件的模式,默认值为’r’,表示读已经存在的zip文件,也可以为’w’或’a’,w’表示新建一个zip文档或覆盖一个已经存在的zip文档,'a’表示将数据附加到一个现存的zip文档中;
(3)参数compression表示在写zip文档时使用的压缩方法,它的值可以是zipfile. ZIP_STORED 或
zipfile. ZIP_DEFLATED。如果要操作的zip文件大小超过2G,应该将allowZip64设置为True。
ZipFile.namelist()获取zip文档内所有文件的名称列表
ZipFile.printdir()将zip文档内的信息打印到控制台上
(2)利用 zipfile实现单个文件压缩
import zipfile
z = zipfile.ZipFile(r'c:\myzip.zip','w')
z.write('./main.py')
z.close()
特别说明:zipfile只能一个个文件的方式写入zip文件,如果想把一个目录的文件写入zip,则只能循环写入
可以通过如下方法向zip压缩包中追加文件。
import zipfile
z = zipfile.ZipFile(r'c:\mytest\压缩包.zip','a')
z.write('./test.py')
z.close()
特别说明:追加到压缩包中文件必须是源压缩包中不存在的,否则会报错
可以通过如下方式删除压缩包中的文件
import zipfile
import shutil
def delFileFromZip(file,zipFile):
'''
函数作用:实现从压缩包zipFile中删除特定的文件(file)
参数:
file: 要从压缩包中删除的文件
zipFile:要操作的压缩包
'''
new_zipfile=r'temp.zip' #新文件
zin = zipfile.ZipFile (zipFile, 'r') #读取对象
zout = zipfile.ZipFile (new_zipfile, 'w') #被写入对象
for item in zin.infolist():
buffer = zin.read(item.filename)
if (item.filename!= file): #剔除要删除的文件
zout.writestr(item, buffer) #把文件写入到新对象中
zout.close()
zin.close()
#用新文件覆盖旧文件
shutil.move(new_zipfile,zipFile)
# 调用实现从my.zip中删除b.txt文件
delFileFromZip('b.txt',r'c:\my.zip')
ZipFile.extract(member[, path[, pwd]])
将zip文档内的指定文件解压到当前目录。参数member指定要解压的文件名称或对应的ZipInfo对象;参数path指定了解析文件保存的文件夹;参数pwd为解压密码。下面一个例子将保存在程序根目录下的text.zip内的所有文件解压到D:/Work目录:
ZipFile.extractall([path[, members[, pwd]]])
解压zip文档中的所有文件到当前目录。参数members的默认值为zip文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。
import zipfile
import os
zipFile = zipfile.ZipFile(r'c:\my.zip')
for file in zipFile.namelist():
zipFile.extract(file, 'c:/my')
zipFile.close()
或:
zipFile.extractall('c:/my') # 和上面效果一样
import zipfile
import os
zipFile = zipfile.ZipFile(r'c:\my.zip')
for file in zipFile.namelist():
if file.endswith('.log'):
zipFile.extract(file, 'c:/mylog')
zipFile.close()
对于 rar 、zip类型的文件压缩,没有特定的类或第三方包对应,只能通过间接的方式进行,可以调用CMD命令进行压缩。
提示:完成以下代码需要一个前提,即:你的电脑中安装了winrar软件
下载地址:http://www.winrar.com.cn/download.htm
import os
password = "123"
dirpath = "C:\test.txt"#待压缩的文件路径及文件
outFullName = "C:\test.zip"#压缩文件的输出路径及文件名
cmd = r'C:\soft\WinRAR\WinRAR.exe a -p%s %s %s' % (password, outFullName, dirpath)
os.system(cmd)
对于 rar,zip 类型的文件压缩,没有特定的类或第三方包对应,只能通过间接的方式进行,可以调用CMD命令进行压缩。
import zipfile #导入模块,它是做压缩和解压缩的
password="123" #我们设定的口令
zfile = zipfile.ZipFile(r"c:\test.zip") #要解压缩的压缩包
zfile.extractall(path=r'C:\test', members=zfile.namelist(), pwd=password.encode('utf-8'))
对于 rar 类型的文件压缩,没有特定的类或第三方包对应,只能通过间接的方式进行,可以调用CMD命令进行压缩。
调用压缩成RAR的CMD命令为:
C:\"Program Files"\WinRAR\WinRAR.exe a -p123 C:\test.rar C:\test.txt
命令参数解释:
调用压缩成ZIP的CMD命令同RAR,只是输出路径不同,需将后缀改为.zip:
C:\"Program Files"\WinRAR\WinRAR.exe a -p123 C:\test.zip C:\test.txt
因此首先需要在电脑上安装WinRAR文件,下载链接为:http://www.winrar.com.cn/download.htm ,官网最新版本的WInRAR软件加密方式AES-256加密,如果需要CRC32加密,也即传统加密方式,可以下载WinRAR5.4版本,百度网盘分享链接:https://pan.baidu.com/s/1IyC9TKJ4E8LmMBZAN2kGXw 提取码:dgkt
在弄清CMD命令后,利用Python实现就很容易了,有两种实现方式:
(1)os.system
(2)subprocess.Popen
接下来的示例采用os模块的system实现,下面分别介绍RAR和ZIP的加密压缩实现:
(1)RAR压缩:
import os
password = "123"
dirpath = r"C:\mylog" #待压缩的文件路径及文件
outFullName = r"C:\mylog.rar"#压缩文件的输出路径及文件名
cmd = r'C:\soft\WinRAR\WinRAR.exe a %s %s' % (outFullName, dirpath) #password为压缩密码
os.system(cmd)
特别说明:
如果你的 winrar 安装在 program Files 中,这个路径中有空格,前后要加个双引号
cmd = r’C:“Program Files”\WinRAR\WinRAR.exe a -p%s %s %s’ % (password, outFullName, dirpath)
(2)RAR加密压缩:
import os
password = "123"
dirpath = r"C:\mylog" #待压缩的文件路径及文件
outFullName = r"C:\mylog.rar"#压缩文件的输出路径及文件名
cmd = r'C:\soft\WinRAR\WinRAR.exe a -p%s %s %s' % (password,outFullName, dirpath) #password为压缩密码
os.system(cmd)
对于 rar 类型的文件解压,需要用到 rarfile 包,该包需要额外安装
pip install rarfile
解压代码:
#coding=utf-8
import rarfile
"""
下面的地址和文件是必须存在的,否则会异常
"""
path = "c:\\my.rar"
path2 = "c:\\my"
rf = rarfile.RarFile(path) #待解压文件
rf.extractall(path2) #解压指定文件路径
rf.close()
要想上述代码能够执行成功,必须得做如下配置
(1)需要WinRAR软件提供的UnRAR.exe文件(rar非开源所以必须使用winrar的文件)
(2)根据 winrar 的目录中的 UnRAR.exe,拷贝到你的 python 脚本目录下
本次任务将通过一系列与Python结合实现办公自动化的经典案例,演示了如何利用Python完成文件管理,提升办公效率。
最终代码:case-01.rar
HR 从公司邮箱中下载了一批简历压缩包,总共几百份。如下图所示:
每个简历压缩包内容如下:
要求整理这批简历,最终形成如下形式:
四个目录分别存放每个简历相关信息:
(1)定义好源路径与目标路径,创建目标目录
(2)解压简历到临时目录
(3)将临时目录中相关文件移动到目标目录中
(4)删除临时目录
1)准备好项目代码
在项目的Code目录下,新建 case-01 目录,将项目素材【简历包】文件放到 该目录下,并在该目录下新建一个名称叫:case-01.py的代码文件,代码结构如下:
2)编写 case-01.py 代码
(1)首先导包
# 导入项目所需的模块
import os
import zipfile
import glob
import shutil
(2)定义并创建相关路径
path = './' # 定义的简历压缩包抽取的目标路径
sourceZip = r'./简历包/*.zip' # 定义简历压缩包所在的路径
docx_path = path+'docx' # 定义的是抽取的word版简历所在的输出路径
photo_path = path+'photo' # 定义的是抽取的照片所在的输出路径
txt_path = path+'txt' # 定义的是推荐信所在的输出路径
pdf_path = path+'pdf' # 定义的是抽取的pdf版简历所在的输出路径
# 根据上述的输出路径去创建对应的目录
if not os.path.exists(docx_path):
os.makedirs(docx_path)
if not os.path.exists(photo_path):
os.makedirs(photo_path)
if not os.path.exists(txt_path):
os.makedirs(txt_path)
if not os.path.exists(pdf_path):
os.makedirs(pdf_path)
tmp_path = r'./tmp' # 定义临时解压路径
# 如果该路径不存在,则创建它
if not os.path.exists(tmp_path):
os.makedirs(tmp_path)
(3)解压
# 抽取简历压缩包所在的目录中的所有zip文件
zipFiles = glob.glob(sourceZip)
# 遍历所有压缩简历包
for f in zipFiles:
# 读取每一个压缩包
z = zipfile.ZipFile(f)
# 解压到临时目录
z.extractall(tmp_path)
z.close()
(4)移动文件到对应目录
# 过滤出临时目录下所有的word文件
docFiles = glob.glob(tmp_path+r'/*.docx')
# 过滤出临时目录下扎有的png文件
photoFiles = glob.glob(tmp_path+r'/*.png')
# 过滤出临时目录下所有的txt文件
txtFiles = glob.glob(tmp_path+r'/*.txt')
# 过滤茁临时目录所有的pdf文件
pdfFiles = glob.glob(tmp_path+r'/*.pdf')
# 移动所有word简历到docx目录下
for f in docFiles:
shutil.move(f,docx_path)
# 移动所有照片到photo目录下
for f in photoFiles:
shutil.move(f,photo_path)
# 移动所有的推荐信(.txt)到txt目录下
for f in txtFiles:
shutil.move(f,txt_path)
# 移动所有的PDF简历到pdf目录下
for f in pdfFiles:
shutil.move(f,pdf_path)
(5)删除临时目录
shutil.rmtree(tmp_path)
3)执行并最终查看效果
我们经常新建文件夹,然后复制一些文件进去。长此以往,就会发现文件夹太多了,找资料很麻烦。-些不常打开的文件“掩埋”在文件夹最深处,我们经常不得不在文件夹“迷宫”里面穿梭,浪费大量时间,而且文件夹内的资料重复率很高。我们希望了解一下文件夹里到底有多少文件,哪些文件是重复的,是可以删除的,我们经常需要清理这些 ”垃圾“ ,以使我们的电脑更 “ 干静”,从而使得我们的电脑运行速度更快,我们的办公效率也会更高。
对于电脑 ”垃圾“ 的清理,通常有如下几种方式
(1)一键输出文件及子文件中的文件目录,且以树状图显示,从而对所有的 “ 资料” 一目了然,对于文件的查找和处理将会更加清晰与方便
(2)修改文件名,将文件进行 ” 扁平化 “ 管理 。将文件由很深的目录树变量单独一级目录的形式显示,将会更加方便文件的查找
(3)删除空文件夹
(4)删除重复文件
1)准备好项目代码
在项目Code目录下,新建 case-02目录,将实验素材【子文件夹】放到case-02目录下
2)代码编写
(1)树状目录输出
在case-02目录下,新建 directoryTree.py
文件,核心实现代码如下:
import os
def filetree(path, depth):
'''
函数名称:filetree
函数使用:将一个目录以树状形式进行输出显示
参数:
path: 要操作的目录
depth: 要显示的树的深度
'''
# 如果 depth==0,则显示文件夹的路径名称
if depth == 0:
print("文件夹:" + path)
# 循环遍历当前目录下所有的子目录及文件
for file in os.listdir(path):
# 输出文件或目录
print("| " * depth + "+--" + file)
# 构造当前目录所对应的完整文件
directory = path +'/'+ file
# 如果这个文件是目录
if os.path.isdir(directory):
# 则继续递归输出子目录下面的内容
filetree(directory, depth +1)
filetree(r'./子文件夹', 0)
在case-02目录下,新建 removeEmptyDir.py
文件,实现删除某目录下所有空目录(包括其下的子目录)的操作,核心代码如下:
import os
def delEmptyDir(path):
'''
函数名称:delEmptyDir
函数作用:用于删除某目录下及其子目录下所有的空文件夹
参数:path 要操作的目录
'''
# 遍历该目录下所有的文件(包括目录)
for file in os.listdir(path):
# 构造文件的完整路径
directory = path +'\\'+ file
try:
# 判断该文件是否是目录,如果是,就删除
if os.path.isdir(directory):
os.rmdir(directory) # 如果不报错,说明其是空目录,正是我们想要删除的
except: # 如果报错,则说明其不是空目录
delEmptyDir(directory) # 继续遍历递归删除操作
delEmptyDir(r'./子文件夹')
具体操作截图如下:
执行成功之后的结果如下图:
(3)删除重复文件
在case-02目录下,新建 removeSameFile.py
文件,实现删除某目录下及其子目录下所有相同文件操作。
判断两个文件是否是同一个文件,最科学的方法是比较这两个文件MD5值。
Python自带的hashlib库里提供了获取文件MD5值的方法,读取一个文件MD5值的方法如下:
import os
import hashlib
def getMD5(file):
m = hashlib.md5()
f = open(file,'rb')
m.update(f.read())
f.close()
md5_value = m.hexdigest()
return md5_value
md5 = getMD5(r'./子文件夹/Python之禅.txt')
print(md5)
继续在 removeSameFile.py 文件中编写删除相同文件的代码:
def rmSameFile(path):
list=[]
for file in os.listdir(path):
fileName = path +'\\'+ file
if os.path.isfile(fileName):
md5_value = getMD5(fileName)
if md5_value in list:
os.unlink(fileName)
print('deleted file:'+fileName)
else:
list.append(md5_value)
else:
rmSameFile(fileName)
调用该函数完成删除相同文件的功能
path=r'./子文件夹'
rmSameFile(path)
具体操作截图:
通过修改文件名,将文件从各个子文件夹移动到了主文件夹下面,同时文件名包含原所在文件的目录信息。这样扁平化处理之后,我们查看文件就更加方便了。
处理前的文件:
处理后的文件:
在Code目录下,新建 floatFile.py 文件,核心代码如下:
import os
import shutil
def floatFiles(sourcePath, targetDir):
'''
函数名称:floatFiles
函数作用:将层层嵌套的文件输出为一级文件(即文件名中包含目录信息)
参数:
sourcePath: 要处理的目录
targetDir:输出处理之后扁平化文件
'''
# 得到源目录所对应的绝对中径
sourcePath = os.path.abspath(sourcePath)
# 遍历源目录下所有的目录及子目录和文件
for foldName, subfolders, filenames in os.walk(sourcePath):
for filename in filenames:
# 得到该目录下每一个文件的绝对路径
abspath=os.path.join(foldName,filename)
# 将绝对路径的名称进行扁平化处理
new_name=abspath.replace("\\","-").replace(":","-").replace("--","-")
# 做更名处理
os.rename(abspath,new_name)
# 创建输出路径
if not os.path.exists(targetDir):
os.makedirs(targetDir)
# 将更名之后的文件移动到新的输出目录中
shutil.move(r'.\\'+new_name, os.path.abspath(targetDir))
调用代码:
sourcePath = r".\子文件夹"
targetPath = r'.\targetFile'
floatFiles(sourcePath,targetPath)
具体操作截图: