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()
看看最后的效果
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)
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)
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))
# 接着,定位缺失的编号
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))