一、需求描述
假设我们有一个记事本文件,里面混乱地存储着不同类型的邮箱地址,每个邮箱地址占一行。如下图所示:
现在我们想把它整理一下,按照邮箱类型建立文件夹,在每个文件夹里建立一个txt文件,存储同类型的邮箱地址。如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/08ccca49955fc80a2527b82eccf520e3.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/7283db570129ed788ab670af18af56c7.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/ae3a37f3b841249224943b5487c8677c.jpeg)
二、思路分析
- 我们要让程序自动识别邮箱类型。如果没建立过这种类型的文件夹,就建立,并在文件夹里建立文本文件,写入邮箱地址;已经建立过,就直接写入邮箱地址。
- 每个邮箱地址的结构,可以概括为“不定长字符串@邮箱类型.com”,我们要提取的内容就夹在@和.com之间,如果知道了@的索引和com前的那个.的索引,就能用切片法取出邮箱类型。
- 为了少占内存,我们一行一行地读取原文件,读到文件末尾就停止。
三、代码实现
import os
my_path='C:\\Users\\22768\\Desktop\\各种邮箱'
#我希望把所有邮箱类型的文件夹都建立在“各种邮箱”文件夹中
with open('C:\\Users\\22768\\Desktop\\mails.txt','r') as f:
#打开原文件
while True:
current_line=f.readline()
#把读取到的一行内容赋值给变量current_line
if current_line=='':
break
#当读取的内容是空字符串的时候,就代表读到文件末尾了,退出循环
index_of_at=current_line.index('@')
#获取@的索引
current_email_type=current_line[index_of_at+1:-5]
#提取邮箱类型,后面的.的索引我们就倒着数,别忘了在末尾还有一个换行符,也占一个字符
files_list=os.listdir(my_path)
#读取“各种邮箱”文件夹中的文件列表
if current_email_type+'邮箱' not in files_list:
os.mkdir(my_path+'\\'+current_email_type+'邮箱')
#如果“各种邮箱”中还没有建立该类型邮箱的专属文件夹,就新建一个,已经有了就往下走
with open(my_path+'\\'+current_email_type+'邮箱\\'+current_email_type+'邮箱.txt','a') as f1:
f1.write(current_line)
#以'a'追加的方式打开专属文件夹中的txt文件(第一次执行这个操作时会自动建立一个txt文件)。把当前读取的这一行内容写入这个文件。