DW-办公自动化01(文件自动化处理&邮件批量处理)
作者:互联网
目录
1 读写文件
1.1 文件路径与当前目录
- 文件的属性:“路径”和“文件名”
注:Windows中文件夹名和文件名不区分大小写的。
-
路径分隔符:在windows上,路径书写是使用倒斜杠
\
作为文件夹之间的分隔符,Linux和OS X用的是正斜杠/
-
路径拼接函数
os.path.join()
- 作用:连接两个或更多的路径名组件
- 注意:
- 1.如果各组件名首字母不包含’/’,则函数会自动加上
- 2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
- 3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
import os os.path.join('test','docu') # 'test\\docu'
结果’test\docu’有两个斜杠,这是因为有一个斜杠是用来转义的,在OS X或Linux上调用这个函数,这个字符串就会是’test/docu’
-
当前工作目录
os.getcwd()
;改变当前目录路径os.chdir()
os.getcwd() # 'C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\test'
os.chdir('C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\1') os.getcwd() # 'C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\1'
注意:并不是将文件移动了,只是改变路径了
1.2 路径操作
1.2.1 绝对与相对路径
-
绝对路径:从根文件夹开始
-
相对路径:相对于程序当前的工作目录。
相对路径中,单个句点“.”表示当前目录的缩写,两个句点“…”表示父文件夹。
-
os.path.abspath(path)
:路径转化函数,将相对路径转化为绝对路径,将返回参数的绝对路径的字符串 -
os.path.isabs(path)
:判断是否为绝对路径,返回True,不是则返回Falseos.path.abspath('.') #当前路径转化为绝对路径。 'C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\1' os.path.isabs('.') #False os.path.isabs(os.path.abspath('.')) #True
注意:原文件并没有被改变路径
1.2.2 路径操作
os.path.relpath(path,start)
:返回从start路径到path的相对路径的字符串。如果没提供start,就使用当前工作目录作为开始路径。os.path.relpath('C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\test','C:\\') # 'Users\\YG小白\\Desktop\\DW-办公自动化\\test'
os.path.dirname(path)
:返回当前路径的目录名称。os.path.basename(path)
:返回当前路径的文件名称path = 'D:\\Datawhale\\python办公自动化\\python课程画图.pptx' os.path.dirname(path) os.path.basename(path) #'D:\\Datawhale\\python办公自动化' # 'python课程画图.pptx'
os.path.split()
:同时需要一个路径的目录名称和基本名称os.path.split(path) # ('D:\\Datawhale\\python办公自动化', 'python课程画图.pptx')
- 也可以调用
os.path.dirname()
和os.path.basename()
,将它们的返回值放在一个元组中,从而得到同样的元组。
(os.path.dirname(path),os.path.basename(path)) #('D:\\Datawhale\\python办公自动化', 'python课程画图.pptx')
- 也可以调用
- 回每个文件夹的字符串的列表:用
split()
字符串方法,并根据os.path.sep
中的字符串进行分割。os.path.sep
变量设置为正确的文件夹分割斜杠path.split(os.path.sep) #['D:', 'Datawhale', 'python办公自动化', 'python课程画图.pptx']
1.2.3 路径有效性检查
os.path
模块提供了一些函数,用于检测给定的路径是否存在,以及判定是文件还是文件夹。os.path.exists(path)
:如果path参数所指的文件或文件夹存在,则返回True,否则返回False。os.path.isfile(path)
:如果path参数存在,并且是一个文件,则返回True,否则返回False。os.path.isdir(path)
:如果path参数存在,并且是一个文件夹,则返回True,否则返回False。os.path.exists('C:\\else') # False os.path.isfile('C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\test\\task1.ipynb') # Ture os.path.isdir('C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\test') # Ture
1.3 文件与文件夹操作
1.3.1 创建新文件夹
os.makedirs(path)
import os os.makedirs('D:\\Datawhale\\practice') #查看目录,已创建,若文件夹已存在,不会覆盖,会报错
注意:
os.makedirs()
可以创建所有必要的中间文件夹
1.3.2 查看文件大小和文件夹内容
os.path.getsize(path)
:返回path参数中文件的字节数。os.listdir(path)
:返回文件名字符串的列表,包含path参数中的每个文件。os.path.getsize('C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\test\\task1.ipynb') # 8333 os.listdir('C:\\Users\\YG小白\\Desktop\\DW-办公自动化') # ['OfficeAutomation', 'OfficeAutomation.rar', 'test']
- 如果想知道目录下所有文件的总字节数,可以同时使用
os.path.getsize()
和os.listdir()
totalSize = 0 for filename in os.listdir('C:\\Users\\YG小白\\Desktop\\DW-办公自动化'): totalSize = totalSize + os.path.getsize(os.path.join('C:\\Users\\YG小白\\Desktop\\DW-办公自动化',filename)) print(totalSize) # 601237
利用路径拼接函数
os.path.join()
,遍历文件夹中的每一个文件路径
1.4 文件读写过程
- 读写文件3个步骤:
1.调用open()
函数,返回一个File对象。
2.调用File对象的read()
或write()
方法。
3.调用File对象的close()
方法,关闭该文件。
1.4.1 打开文件
- 用
open()
函数打开文件:向它传递一个字符串路径,表明希望打开的文件。这既可以是绝对路径,也可以是相对路径。open()
函数返回一个File对象。helloFile = open('C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\test\\hello.txt') print(helloFile) # <_io.TextIOWrapper name='C:\\Users\\YG小白\\Desktop\\DW-办公自动化\\test\\hello.txt' mode='r' encoding='cp65001'>
调用open()函数将会返回一个File对象。当需要读取或写入该文件,就可以调用helloFile变量中的File对象的方法。
1.4.2 读取文件内容
- 有了File对象,我们就可以开始从它读取内容。
read()
:读取文件内容。readlines()
:按行读取文件中的内容,取得一个字符串列表,列表中每个字符串是文本中的一行且以\n结束。
helloContent = helloFile.read() helloContent ''' 'Hello World!\n你好,世界!' '''
sonnetFile = open('D:\\Datawhale\\python办公自动化\\hello.txt') sonnetFile.readlines() ''' ['Hello World!\n', '你好,世界!'] '''
1.4.3 写入文件
-
需要用“写模式”
‘w’
和“添加模式”'a'
打开一个文件,而不能用读模式打开文件。 “写模式”将覆写原有的文件,从头开始。“添加模式”将在已有文件的末尾添加文本# 写模式 baconFile=open('bacon.txt','w') baconFile.write('Hello World!\n') baconFile.close() #注意,关闭后,才能完成写入,从txt文件中看到写入的内容。 baconFile=open('bacon.txt') baconFile.read() ''' 'Hello World!\n' '''
# 添加模式 baconFile=open('bacon.txt','a') baconFile.write('Bacon is not a vegetable.') baconFile.close() baconFile=open('bacon.txt') baconFile.read() ''' 'Hello World!\nBacon is not a vegetable.' ''' print(content) # 和.read()模式的显示不同 ''' Hello World! Bacon is not a vegetable. '''
注意:
1 如果没有该类型名称文件,会直接新建一个该类型名称文件
2baconFile.close()
关闭后,才能完成写入,从txt文件中看到写入的内容。
3write()
方法不会像print()
函数那样,在字符串的末尾自动添加换行字符。必须自己添加该字符。
1.4.4 保存变量
-
shelve
模块- 作用:用shelve模块,可以将Python中的变量保存到二进制的
shelf
文件中。这样,程序就可以从硬盘中恢复变量的数据。
import shelve shelfFile = shelve.open('mydata') cats = ['Zonphie','Pooka','Simon'] shelfFile['cats'] = cats shelfFile.close()
在Windows上运行前面的代码,会看到当前工作目录下有3个新文件:mydata.bak、mydata.dat和mydata.dir
shelfFile = shelve.open('mydata') type(shelfFile) ''' shelve.DbfilenameShelf ''' shelfFile['cats'] ''' ['Zonphie', 'Pooka', 'Simon'] ''' shelfFile.close()
注意:shelf值不必用读模式或写模式打开,因为打开后,既能读又能写。
- 像字典一样,
shelf
值有keys()
和values()
方法,返回shelf中键和值的类似列表的值。但是这些方法返回类似列表的值,却不是真正的列表,所以应该将它们传递给list()
函数,取得列表的形式。
shelfFile = shelve.open('mydata') list(shelfFile.keys()) ''' ['cats'] ''' list(shelfFile.values()) ''' [['Zonphie', 'Pooka', 'Simon']] ''' shelFile.close()
- 作用:用shelve模块,可以将Python中的变量保存到二进制的
-
用
pprint.pformat()
函数保存变量- 作用:
pprint.pformat()
函数返回要打印的内容的文本字符串,这个字符串既易于阅读,也是语法上正确的Python代码。 - 用途:假如,有一个字典,保存在一个变量中,希望保存这个变量和它的内容,以便将来使用。
pprint.pformat()
函数将提供一个字符串,我们可以将它写入.py文件。这个文件可以成为我们自己的模块,如果需要使用存储其中的变量,就可以导入它。
import pprint cats = [{'name':'Zophie','desc':'chubby'},{'name':'Pooka','desc':'fluffy'}] pprint.pformat(cats) ''' "[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]" ''' fileObj = open('myCats.py','w') fileObj.write('cats = '+pprint.pformat(cats)+'\n') fileObj.close() # 查看内容 File=open('myCats.py') content=File.read() print(content) ''' cats = [{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}] '''
- import语句导入的模块本身就是Python脚本。如果来自
pprint.pformat()
的字符串保存为一个.py文件,该文件就是一个可以导入的模块。
import myCats myCats.cats ''' [{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}] ''' myCats.cats[0] ''' {'desc': 'chubby', 'name': 'Zophie'} ''' myCats.cats[0]['name'] ''' 'Zophie' '''
- 作用:
2 练习
1.如果已有的文件以写模式打开,会发生什么?
- 如果用【写模式】打开已有文件,则文件里的内容会被全部清空。
- 如果文件已存在,则覆盖写(即文件内原始数据会被新写入的数据清空覆盖)。
2.read()和readlines()方法之间的区别是什么?
- .read() 每次读取整个文件,它通常将读取到底文件内容放到一个字符串变量中,也就是说 .read() 生成文件内容是一个字符串类型。
- .readline()每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str类型。
- .readlines()每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list类型。
helloContent = helloFile.read() helloContent ''' 'Hello World!\n你好,世界!' '''
helloContent = helloFile.readline() helloContent ''' 'Hello World!\n' '''
sonnetFile = open('D:\\Datawhale\\python办公自动化\\hello.txt') sonnetFile.readlines() ''' ['Hello World!\n', '你好,世界!'] '''
3.题目:生成随机的测验试卷文件
假如你是一位地理老师, 班上有 35 名学生, 你希望进行美国各州首府的一个 小测验。不妙的是,班里有几个坏蛋, 你无法确信学生不会作弊。你希望随机调整 问题的次序, 这样每份试卷都是独一无二的, 这让任何人都不能从其他人那里抄袭答案。当然,手工完成这件事又费时又无聊。 好在, 你懂一些 Python。
下面是程序所做的事:
• 创建 35 份不同的测验试卷。
• 为每份试卷创建 50 个多重选择题,次序随机。
• 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
• 将测验试卷写到 35 个文本文件中。
• 将答案写到 35 个文本文件中。
这意味着代码需要做下面的事:
• 将州和它们的首府保存在一个字典中。
• 针对测验文本文件和答案文本文件,调用 open()、 write()和 close()。
• 利用 random.shuffle()随机调整问题和多重选项的次序。
# 美国各州首府数据在一个字典中
# The quiz data. Keys are states and values are their capitals.
capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix',
'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver',
'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee',
'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois':
'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas':
'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine':
'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan':
'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri':
'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada':
'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'New
Mexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City',
'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence',
'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee':
'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont':
'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West
Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}
# 测验试卷的文件名将是capitalsquiz.txt
# capitalsquiz.txt 的答案将保存在一个文本文件中,名为 capitalsquiz_answers.txt
import random
for quizNum in range(35):
# 创建试卷和答案文件
quizFile = open('capticalsquiz%s.txt' % (quizNum + 1), 'w')
answerKeyFile = open('capticalsquiz_answers%s.txt' % (quizNum + 1), 'w')
# 写标题和开头
quizFile.write('Name:\n\nDate:\n\nClass:\n\n')
quizFile.write(' ' * 20 + 'State Capticals Quiz (From %s)' % (quizNum + 1))
quizFile.write('\n\n')
# 打乱capital字典
states = list(capitals.keys())
random.shuffle(states) # 打乱states的顺序
# 循环states,制造50个问题
for questionNum in range(50):
correctAnswer = capitals[states[questionNum]]
wrongAnswers = list(capitals.values())
del wrongAnswers[wrongAnswers.index(correctAnswer)] # 删除列表中的正确答案
# random.sample()函数使得这种选择很容易,它的第一个参数是你希望选择的列表,第二个参数是你希望选择的值的个数。
wrongAnswers = random.sample(wrongAnswers, 3)
answerOption = wrongAnswers + [correctAnswer]
random.shuffle(answerOption)
# 在文件中写入问题
quizFile.write('%s. What is the capital of %s?\n' % (questionNum + 1,
states[questionNum]))
for i in range(4):
quizFile.write(' %s. %s\n' % ('ABCD'[i], answerOption[i]))
quizFile.write('\n')
# 在答案卷中写入答案
answerKeyFile.write('%s. %s\n' % (questionNum + 1, 'ABCD'[
answerOption.index(correctAnswer)]))
quizFile.close()
3 组织文件
- 如何用程序组织硬盘上已经存在的文件
- 在一个文件夹及其所有子文件夹中,复制所有的 pdf 文件(且只复制 pdf 文件)
- 针对一个文件夹中的所有文件,删除文件名中前导的零
3.1 shutil模块
shutil
(或称为shell工具)模块中包含一些函数,可以在Python程序中复制、移动、改名和删除文件。要使用shutil的函数,首先需要import shutil
3.1.1 复制文件和文件夹
shutil.copy(source, destination)
:将路径source处的文件复制到路径 destination处的文件夹(source 和 destination 都是字符串),并返回新复制文件绝对路径字符串。- destination可以是:
- 一个文件的名称,则将source文件复制到该文件,并覆盖之前文件内容
- 一个文件夹,则将source文件复制到该文件夹中
- 若destination文件夹不存在,则自动生成该文件。(慎用,因为会将source文件复制为一个没有扩展名的名字为destination的文件,这往往不是我们希望的)
import shutil # 复制到另一个文件里,覆盖 shutil.copy('D:\\Datawhale\\python办公自动化\\bacon.txt', 'D:\\Datawhale\\bacon1.txt') ''' 'D:\\Datawhale\\bacon1.txt' ''' # 复制到已有的文件夹里 shutil.copy('D:\\Datawhale\\python办公自动化\\bacon.txt', 'D:\\Datawhale\\practice') ''' 'D:\\Datawhale\\practice\\bacon.txt' ''' # 复制到没有命名的文件夹里 shutil.copy('D:\\Datawhale\\python办公自动化\\bacon.txt', 'D:\\Datawhale\\practice1') ''' 'D:\\Datawhale\\practice1' '''
- destination可以是:
shutil.copytree(source, destination)
:将路径source处的文件夹,包括其包含的文件夹和文件,复制到路径destination处的文件夹,并返回新复制文件夹绝对路径字符串。注:destination处的文件夹为新创建的文件夹,如已存在,则会报错
shutil.copytree('D:\\Datawhale\\1','D:\\Datawhale\\practice1') ''' 'D:\\Datawhale\\practice1' '''
3.1.2 文件和文件夹的移动与改名
shutil.move(source, destination)
:将路径 source 处的文件/文件夹移动到路径destination,并返回新位置的绝对路径的字符串- 移动: 如果source和destination是文件夹,且destination已存在,则会将source文件夹下所有内容复制到destination文件夹中。
- 移动+重命名: 如果source是文件夹,destination不存在,则会将source文件夹下所有内容复制到destination文件夹中,source原文件夹名称将被替换为destination文件夹名。
- 移动+重命名: 如果source和destination是文件,source处的文件将被移动到destination处的位置,并以destination处的文件名进行命名。
- 报错: source是文件,destination是文件夹,若文件夹内有source同名文件,则报错。
注意:如果destination中有原来已经存在同名文件,移动后,会被覆写,所以应当特别注意。
shutil.move('D:\\Datawhale\\docue\\bacon.txt','D:\\Datawhale\\docu') ''' Error: Destination path 'D:\Datawhale\docu\bacon.txt' already exists ''' shutil.move('D:\\Datawhale\\docue\\bacon.txt','D:\\Datawhale\\docu\\bacon.txt') ''' 'D:\\Datawhale\\docu\\bacon.txt' '''
3.1.3 永久删除文件和文件夹
os.unlink(path)
: 删除path处的文件os.rmdir(path)
: 删除path处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。shutil.rmtree(path)
:删除 path 处的文件夹,它包含的所有文件和文件夹都会被删除。(不可恢复的删除)注意:使用时,需要非常小心,避免删错文件,一般在第一次运行时,注释掉这些程序,并加上print()函数来帮助查看是否是想要删除的文件。
#建议先指定操作的文件夹,并查看 os.chdir('D:\\Datawhale\\docue') # 更改当前路径为目标路径 os.getcwd() # 查看是否是目标路径 import os for filename in os.listdir(): # 目标文件夹内文件的遍历 if filename.endswith('.dir'): # 查找目标文件 # os.unlink(filename) # 删除目标文件 print(filename) # 打印目标文件 ''' 测试.dir '''
3.1.4 用send2trash模块安全地删除
- 因此使用第三方的send2trash模块,可以将文件或文件夹发送到计算机的垃圾箱或回收站,而不是永久删除。
使用时,需要非常小心,避免删错文件,一般在第一次运行时,注释掉这些程序,并加上print()函数来帮助查看是否是想要删除的文件。
import send2trash send2trash.send2trash('bacon.txt')
3.2 遍历目录树
-
os.walk(path)
:传入一个文件夹的路径,在for循环语句中使用os.walk()
函数,遍历目录树,和range()
函数遍历一个范围的数字类似。不同的是,os.walk()在循环的每次迭代中,返回三个值:- 1 当前文件夹名称的字符串。
- 2 当前文件夹中子文件夹的字符串的列表。
- 3 当前文件夹中文件的字符串的列表。
import os for folderName, subFolders,fileNames in os.walk('D:\\animals'): 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('')
3.3 用zipfile模块压缩文件
- 利用
zipfile
模块中的函数,Python程序可以创建和打开(或解压)zip文件。
3.3.1 创建和添加到zip文件
zipfile.ZipFile('filename.zip', 'w')
:以写模式创建一个压缩文件- ZipFile 对象的
write('filename','compress_type=zipfile.ZIP_DEFLATED')
- 第一个参数:如果向
write()
方法中传入一个路径,Python 就会压缩该路径所指的文件, 将它加到 ZIP 文件中。 如果向write()
方法中传入一个字符串,代表要添加的文件名。 - 第二个参数:是“压缩类型”参数,告诉计算机用怎样的算法来压缩文件。可以总是将这个值设置为 zipfile.ZIP_DEFLATED(这指定了 deflate 压缩算法,它对各种类型的数据都很有效)
- 第一个参数:如果向
注意:写模式会擦除zip文件中所有原有的内容。如果只希望将文件添加到原有的zip文件中,就要向zipfile.ZipFile()传入’a’作为第二个参数,以添加模式打开 ZIP 文件。
## 1 创建一个new.zip压缩文件,并向其中添加文件 import zipfile newZip = zipfile.ZipFile('new.zip','w') newZip.write('Miki.txt',compress_type=zipfile.ZIP_DEFLATED) newZip.close() ''' 在当前文件夹中新建一个'new.zip'的压缩包,并向该压缩包内添加'Miki.txt' '''
newZip = zipfile.ZipFile('new.zip','w') newZip.write('D:\\animals\\dogs\\Taidi.txt',compress_type=zipfile.ZIP_DEFLATED) newZip.close() ''' 在'new.zip'的压缩包内添加'Taidi.txt',并覆盖之前压缩包里的文件 '''
## 2 创建一个example.zip的压缩文件,将animals文件夹下所有文件进行压缩。 import zipfile import os newZip = zipfile.ZipFile('example.zip','w') for folderName, subFolders,fileNames in os.walk('D:\\animals'): for filename in fileNames: newZip.write(os.path.join(folderName,filename),compress_type=zipfile.ZIP_DEFLATED) newZip.close()
- ZipFile 对象的
3.3.2 读取zip文件
- 首先要调用
zipfile.ZipFile(filename)
函数创建一个ZipFile
对象(注意大写字母Z和F
),filename是要读取zip文件的文件名。 ZipFile
对象中的两个常用方法:namelis()
方法,返回zip文件中包含的所有文件和文件夹的字符串列表。getinfo()
方法,返回一个关于特定文件的ZipInfo
对象。ZipInfo
对象的两个属性:file_size
和compress_size
,分别表示原来文件大小和压缩后文件大小
import zipfile,os exampleZip = zipfile.ZipFile('example.zip') exampleZip.namelist() ''' ['animals/example.zip', 'animals/Miki.txt', 'animals/new.zip', 'animals/cats/catNames.txt', 'animals/cats/zophie.jpg', 'animals/dogs/taidi.txt'] '''
catInfo = exampleZip.getinfo('animals/Miki.txt') catInfo.file_size # 45 catInfo.compress_size # 8 print('Compressed file is %s x smaller!' %(round(catInfo.file_size/catInfo.compress_size,2))) # Compressed file is 5.62 x smaller! exampleZip.close()
3.3.3 从zip文件中解压缩
- ZipFile 对象的
extractall()
:从zip文件中解压缩所有文件和文件夹,放到当前工作目录中。也可以向extractall()传递的一个文件夹名称,它将文件解压缩到那个文件夹, 而不是当前工作目录。如果传递的文件夹名称不存在,就会被创建。 - ZipFile 对象的
extract()
:从zip文件中解压单个文件。也可以向 extract()传递第二个参数, 将文件解压缩到指定的文件夹, 而不是当前工作目录。如果第二个参数指定的文件夹不存在, Python 就会创建它。extract()的返回值是被压缩后文件的绝对路径。import zipfile, os exampleZip = zipfile.ZipFile('example.zip') exampleZip.extractall('.\zip') exampleZip.close() ''' 将'example.zip'解压到zip文件夹中 '''
exampleZip = zipfile.ZipFile('example.zip') exampleZip.extract('animals/Miki.txt') exampleZip.extract('animals/Miki.txt', 'D:\\animals\\folders') exampleZip.close() ''' 只解压'example.zip'中的Miki.txt文件,到folders文件夹中 '''
4 练习
1 编写一个程序,遍历一个目录树,查找特定扩展名的文件(诸如.pdf 或.jpg)。不论这些文件的位置在哪里, 将它们拷贝到一个新的文件夹中。
import os,shutil
for foldername,subfolders,filenames in os.walk('D:\\Datawhale\\test1'):
for filename in filenames:
if filename.endswith('.jpg'): # 以'.jpg'结尾的文件
source=os.path.join(foldername,filename) # 路径拼接函数
print(source)
shutil.copy(source,'D:\\Datawhale\\new')
else:
coutine
注意:
1.for循环后面的:
不要忘记
2.如果没有目标文件夹,会新建一个无拓展名的目标文件
2 编写一个程序, 遍历一个目录树, 查找特别大的文件或文件夹, 比方说, 超过100MB 的文件(回忆一下,要获得文件的大小,可以使用 os 模块的 os.path.getsize())。将这些文件的绝对路径打印到屏幕上。
import os,shutil
for foldername,subfolders,filenames in os.walk('D:\\BaiduNetdiskDownload'):
for filename in filenames:
source=os.path.join(foldername,filename)
if os.path.getsize(source)>512000:
print(source)
print(os.path.getsize(source))
3 编写一个程序, 在一个文件夹中, 找到所有带指定前缀的文件, 诸如 spam001.txt,spam002.txt 等,并定位缺失的编号(例如存在 spam001.txt 和 spam003.txt, 但不存在 spam002.txt)。让该程序对所有后面的文件改名, 消除缺失的编号。
import os,re,shutil
num = 1
for foldername,subfolders,filenames in os.walk('D:\\test9.2'):
for filename in filenames:
# 正则
mo = re.compile(r'spam\d{3}.*(\.\w*)$').search(filename)
if mo == None:
continue
else:
if num < 10:
temp = 'spam00'+str(num)+mo.group(1)
if num>=10 and num<100:
temp = 'spam0'+str(num)+mo.group(1)
if num>=100:
temp = 'spam'+str(num)+mo.group(1)
print(temp)
shutil.move(os.path.join(foldername,filename),os.path.join(foldername,temp))
num=num+1
作为附加的挑战,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件。
5 自动发送电子邮件
- Python有两个内置库:
smtplib
和email
,能够实现邮件功能,smtplib
库负责发送邮件,email
库负责构造邮件格式和内容。 - 邮件发送需要遵守SMTP协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
#1 先导入相关的库和方法
import smtplib #导入库
from smtplib import SMTP_SSL #加密邮件内容,防止中途被截获
from email.mime.text import MIMEText #构造邮件的正文
from email.mime.image import MIMEImage #构造邮件的图片
from email.mime.multipart import MIMEMultipart #把邮件的各个部分装在一起,邮件的主体
from email.header import Header #邮件的文件头,标题,收件人
#2 设置邮箱域名、发件人邮箱、邮箱授权码、收件人邮箱
host_server = 'smtp.163.com' #sina 邮箱smtp服务器 #smtp 服务器的地址
sender_163 = 'pythonauto_emai@163.com' #sender_163为发件人的邮箱
pwd = 'DYEPOGLZDZYLOMRI' #pwd为邮箱的授权码'DYEPOGLZDZYLOMRI'
#也可以自己注册个邮箱,邮箱授权码'DYEPOGLZDZYLOMRI' 获取方式可参考#http://help.163.com/14/0923/22/A6S1FMJD00754KNP.html
receiver = '********@163.com'
#3 构建MIMEMultipart对象代表邮件本身,可以往里面添加文本、图片、附件等
msg = MIMEMultipart() #邮件主体
#4 设置邮件头部内容
mail_title = 'python办公自动化邮件' # 邮件标题
msg["Subject"] = Header(mail_title,'utf-8') #装入主体
msg["From"] = sender_163 #寄件人
msg["To"] = Header("测试邮箱",'utf-8') #标题
#5 添加正文文本
mail_content = "您好,这是使用python登录163邮箱发送邮件的测试" #邮件的正文内容
message_text = MIMEText(mail_content,'plain','utf-8') #构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式
msg.attach(message_text) # 向MIMEMultipart对象中添加文本对象
#6 添加图片
image_data = open('cat.jpg','rb') # 二进制读取图片
message_image = MIMEImage(image_data.read()) # 设置读取获取的二进制数据
image_data.close() # 关闭刚才打开的文件
msg.attach(message_image) # 添加图片文件到邮件信息当中去
# 7 添加附件(excel表格)
atta = MIMEText(open('cat.xlsx', 'rb').read(), 'base64', 'utf-8') # 构造附件
atta["Content-Disposition"] = 'attachment; filename="cat.xlsx"' # 设置附件信息
msg.attach(atta) ## 添加附件到邮件信息当中去
#8 发送邮件
smtp = SMTP_SSL(host_server) #SSL登录 创建SMTP对象
smtp.login(sender_163,pwd) ## 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码
smtp.sendmail(sender_163,receiver,msg.as_string()) # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str
print("邮件发送成功")
smtp.quit # 关闭SMTP对象
标签:文件夹,文件,01,zip,办公自动化,path,DW,txt,os 来源: https://blog.csdn.net/OohMuYi/article/details/117956056