其他分享
首页 > 其他分享> > DW-办公自动化01(文件自动化处理&邮件批量处理)

DW-办公自动化01(文件自动化处理&邮件批量处理)

作者:互联网

目录

1 读写文件

1.1 文件路径与当前目录

注:Windows中文件夹名和文件名不区分大小写的。

1.2 路径操作

1.2.1 绝对与相对路径

1.2.2 路径操作

1.2.3 路径有效性检查

1.3 文件与文件夹操作

1.3.1 创建新文件夹

1.3.2 查看文件大小和文件夹内容

1.4 文件读写过程

1.4.1 打开文件

1.4.2 读取文件内容

1.4.3 写入文件

1.4.4 保存变量


2 练习

1.如果已有的文件以写模式打开,会发生什么?

2.read()和readlines()方法之间的区别是什么?

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 组织文件

3.1 shutil模块

3.1.1 复制文件和文件夹

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

3.1.3 永久删除文件和文件夹

3.1.4 用send2trash模块安全地删除

3.2 遍历目录树

3.3 用zipfile模块压缩文件

3.3.1 创建和添加到zip文件

3.3.2 读取zip文件

3.3.3 从zip文件中解压缩


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 自动发送电子邮件

#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