Task01:Python文件自动化处理&邮件批量处理

  • 1.1.6 练习
  • 1、如果已有的文件以写模式打开,会发生什么?
  • 2、`read()`和`readlines()`方法之间的区别是什么?
  • 生成随机的测验试卷文件
  • 将州和它们的首府保存在一个字典中
  • 针对测验文本文件和答案文本文件,调用 open()、 write()和 close()
  • 利用 random.shuffle()随机调整问题和多重选项的次序
  • 完整代码
  • 看看最后的效果
  • 1.2.4练习


1.1.6 练习

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

# 首先打开已有的文件,查看文件原有内容
import os
path = 'D:\\组团学习\\hello.txt'
with open(path) as f:
    print(f.read())

输出:

hello world!
hello python!
# 接着,以写模式打开文件
import os
path = 'D:\\组团学习\\hello.txt'
with open(path,'w') as f:
    f.write("你好\n")
# 最后,再次查看文件原有内容
with open(path) as f:
    print(f.read())

输出:

你好

可见,如果已有的文件以写模式打开,会覆盖原有文件的内容。

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

import os
path = 'D:\\组团学习\\hello.txt'
# 首先,观察read()和readlines()方法的返回值类型
with open(path) as f:
    print("read():\n" + str(type(f.read())) + "\n")
with open(path) as f:    
    print("readlines():\n" + str(type(f.readlines())) + "\n")
# 接着, 观察read()和readlines()方法的返回值内容
with open(path) as f:    
    print("read():\n" + f.read() + "\n")
with open(path) as f:    
    print("readlines():" )
    print(f.readlines())

输出:

read():
<class 'str'>

readlines():
<class 'list'>

read():
hello world
hello python
hello feng

readlines():
['hello world\n', 'hello python\n', 'hello feng']

可见,read()readlines()方法之间的区别在于:
read()方法的返回值是字符串类型
readlines()方法的返回值是列表类型

生成随机的测验试卷文件

假如你是一位地理老师,班上有 35 名学生,你希望进行美国各州首府的一个小测验。不妙的是,班里有几个坏蛋,你无法确信学生不会作弊。你希望随机调整问题的次序, 这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案。当然,手工完成这件事又费时又无聊。好在,你懂一些Python。

下面是程序所做的事:
• 创建 35 份不同的测验试卷。
• 为每份试卷创建 50 个多重选择题,次序随机。
• 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
• 将测验试卷写到 35 个文本文件中。
• 将答案写到 35 个文本文件中。
这意味着代码需要做下面的事:
• 将州和它们的首府保存在一个字典中。
• 针对测验文本文件和答案文本文件,调用 open()、 write()和 close()。
• 利用 random.shuffle()随机调整问题和多重选项的次序。

将州和它们的首府保存在一个字典中

# 美国各州首府
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'}

针对测验文本文件和答案文本文件,调用 open()、 write()和 close()

for stu in range(35):
    shijuan = open("demo"+"{:0>2d}".format(stu+1)+".txt","a")  # 打开试题文件
    daan = open("answer"+"{:0>2d}".format(stu+1)+".txt","a")  # 打开答案文件
    # TODO 将试题写入试题文件中,答案写入答案文件中。
    shijuan.write("...")
    daan.write("...")
    # 关闭文件
    shijuan.close()
    daan.close()

利用 random.shuffle()随机调整问题和多重选项的次序

# 打乱题目顺序
timu = list(capitals.keys())
random.shuffle(timu) 

# 打乱选项顺序
xuanxiang = random.sample(set(capitals.values()).difference(capitals[item]),3)  #抽取3个错误答案
xuanxiang.append(capitals[item])
random.shuffle(xuanxiang)

完整代码

import random
import os

os.chdir('D:\\组团学习\\shijuan')            #改变当前工作目录

# 美国各州首府
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'}

# 获取州名
timu = list(capitals.keys())
# 遍历35份试卷
for stu in range(35):
    random.shuffle(timu)  # 打乱题目顺序
    shijuan = open("demo"+"{:0>2d}".format(stu+1)+".txt","a")  # 打开试题文件
    daan = open("answer"+"{:0>2d}".format(stu+1)+".txt","a")  # 打开答案文件
    shijuan.write("姓名:\t\t班级:\t\t学号:\n\n")
    num = 1  # 题号
    for item in timu: 
        xuanxiang = []
        shijuan.write(str(num)+".请问"+item+"的首府是(  )?\n")
        xuanxiang = random.sample(set(capitals.values()).difference(capitals[item]),3)  #抽取3个错误答案
        xuanxiang.append(capitals[item])
        random.shuffle(xuanxiang)  # 打乱选项顺序
        shijuan.write("A."+xuanxiang[0]+"\t")
        shijuan.write("B."+xuanxiang[1]+"\n")
        shijuan.write("C."+xuanxiang[2]+"\t")
        shijuan.write("D."+xuanxiang[3]+"\n\n")
        daan.write(str(num)+"."+chr(65+xuanxiang.index(capitals[item]))+"\n")
        num += 1
    # 关闭文件
    shijuan.close()
    daan.close()

看看最后的效果

python 收邮件自动转发 python自动处理邮件_python 收邮件自动转发

python 收邮件自动转发 python自动处理邮件_3d_02

1.2.4练习

1)、编写一个程序,遍历一个目录树,查找特定扩展名的文件(诸如.pdf 或.jpg)。不论这些文件的位置在哪里, 将它们拷贝到一个新的文件夹中。

import os
import shutil
path = 'D:\\组团学习\\walkTest'
copyPath = 'D:\\组团学习\\copyPath'
for folderName, _, fileNames in os.walk(path):
    for filename in fileNames:
        if filename.endswith('.png'):
            shutil.copy(os.path.join(folderName,filename),copyPath)

python 收邮件自动转发 python自动处理邮件_python 收邮件自动转发_03

2) 、一些不需要的、 巨大的文件或文件夹占据了硬盘的空间, 这并不少见。如果你试图释放计算机上的空间, 那么删除不想要的巨大文件效果最好。但首先你必须找到它们。编写一个程序, 遍历一个目录树, 查找特别大的文件或文件夹, 比方说, 超过100MB 的文件(回忆一下,要获得文件的大小,可以使用 os 模块的 os.path.getsize())。将这些文件的绝对路径打印到屏幕上。

import os
import shutil
path = 'D:\\data'
copyPath = 'D:\\data\\copyPath'
for folderName, _, fileNames in os.walk(path):
    for filename in fileNames:
        filePath = os.path.join(folderName,filename)
        if os.path.getsize(filePath) > 100*1024*1024:
            shutil.copy(filePath,copyPath)

python 收邮件自动转发 python自动处理邮件_2d_04

3)、编写一个程序,在一个文件夹中,找到所有带指定前缀的文件,诸如spam001.txt,spam002.txt 等,并定位缺失的编号(例如存在 spam001.txt 和spam003.txt,但不存在 spam002.txt)。让该程序对所有后面的文件改名,消除缺失的编号。作为附加的挑战,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件。

# 首先,在一些连续编号的文件中,空出一些编号,以便加入新的文件
import os
import random
os.chdir('D:\\组团学习\\test3')          #改变当前工作目录
# 生成从1到10中其中的8个文件
for i in random.sample(range(10),8):
    filename = "spam{:0>3d}.txt".format(i+1)
    with open(filename,"w") as f:
        f.write("==========Hello spam{:0>3d}.txt!==========\n".format(i+1))

python 收邮件自动转发 python自动处理邮件_python 收邮件自动转发_05

# 接着,定位缺失的编号
path = os.getcwd()
for folderName, _, fileNames in os.walk(path):
    filelist = []
    for filename in fileNames:
        filelist.append(int(filename.strip("spam").strip(".txt")))
# 最后,生成缺失的编号的文件   
for i in range(10):
    if i+1 not in filelist:
        filename = "spam{:0>3d}.txt".format(i+1)
        with open(filename,"w") as f:
            f.write("***********Hello spam{:0>3d}.txt!***********\n".format(i+1))

python 收邮件自动转发 python自动处理邮件_2d_06