开篇的话:不明白为什么这一个章节会去这么个名字,这篇笔记的末尾,我会结合自己电脑里一堆文件的实际需求写一个小脚本
调用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 模块,可以删除一个文件夹及其所有的内容。
在程序中使用这些函数时要小心!可以第一次运行程序时,注释掉这些调用,并且加上 print()调用,显示会被删除的文件。
import os
for filename in os.listdir('D:\\haha'):
if filename.endswith('.txt'):
#os.unlink(filename)
print(filename)
# 删除D盘haha文件夹中所有txt文件
删除文件和文件夹的更好方法,是使用第三方的 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 个值:
所谓当前文件夹,是指 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,现在来介绍我自己做的一个小练习
在我的移动硬盘里有一堆家具模型,我想要把他们每个模型的预览图都整理出来,要排除掉贴图文件,和一些其他乱七八糟的图片。
类似上图中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之后发现有错误,便于删除。