Task 01 文件自动化处理-Datawhale

本文详细介绍了Python中的文件处理,包括路径操作、文件读写、shelve模块、pprint.pformat()方法以及shutil模块的功能。通过示例展示了如何创建、读取、修改和删除文件,以及如何进行文件的复制、移动和压缩。此外,还涉及到了使用Python发送邮件的过程,包括构造邮件内容、添加附件和发送邮件。
摘要由CSDN通过智能技术生成

1、文件处理

环境:window10,工具pycharm

1.1 os.path.join()函数

连接两个或更多的路径名组件
1.如果各组件名首字母不包含’/’,则函数会自动加上
2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾

import os
os.path.join('Datawhale','docu') #Datawhale\docu

1.2 获取当前目录

以当前目录:E:/python/自动化为例子,

import os
os.getcwd() #E:\python\自动化 #E:\python\自动化
os.chdir('E:/python/')          #改变当前工作目录
os.getcwd() #E:\python

1.3 路径操作

路径分为绝对路径和相对路径
绝对路径:指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径
相对路径:指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。相对路径中单个句点“.”表示当前目录的缩写,两个句点“…”表示父文件夹
路径函数:
1.os.path.abspath(path):将相对路径转换成绝对路径。
os.path.abspath(’.’) # E:\python\自动化
2.os.path.isabs(’.’) #False #判断是否是相对路径
os.path.isabs(os.path.abspath(’.’)) #True
3.os.path.relpath(path,start)
返回从start路径到path的相对路径的字符串。如果没提供start,就使用当前工作目录作为开始路径。
os.path.relpath(‘E:\python\自动化’,‘E:\python’) #自动化
E:/python/自动化
4. os.path.dirname()
功能:去掉文件名,返回目录
path = ‘E:/python/自动化/Task 01 文件自动化处理.py’
print(os.path.dirname(path)) #E:/python/自动化
5.os.path.basename(path)
返回脚本的文件名称
Task 01 文件自动化处理.py
6.os.path.split(path)
用数组的方式输出路径和文件名
(‘E:/python/自动化’, ‘Task 01 文件自动化处理.py’)
7.os.path.sep
获取路径分隔符
path.split("/")#返回每个文件夹的字符串的列表
[‘E:’, ‘python’, ‘自动化’, ‘Task 01 文件自动化处理.py’]
8.os.path.exists(path)
如果path参数所指的文件或文件夹存在,则返回True,否则返回False。
True
9.os.path.isfile(path)
如果path参数存在,并且是一个文件,则返回True,否则返回False
True
10.os.path.isdir(path)
如果path参数存在,并且是一个文件夹,则返回True,否则返回False
False
11.os.makedirs()
#查看目录,已创建,若文件夹已存在,不会覆盖,会报错
os.makedirs(‘E:/python/自动化/test’)
会在目录下创建一个tesr文件夹
12.os.path.getsize()
返回path参数中文件的字节数
os.path.getsize(path)
598
13. os.listdir(path)
返回文件名字符串的列表,包含path参数中的每个文件。
os.listdir(‘E:/python/自动化’)
[’.idea’, ‘main.py’, ‘Task 01 文件自动化处理.py’, ‘test.html’]
14.open()
helloFile = open(‘E:/python/自动化/Task 01 文件自动化处理.py’)
print(helloFile)
<_io.TextIOWrapper name=‘E:/python/自动化/Task 01 文件自动化处理.py’ mode=‘r’ encoding=‘cp936’>
15.read()
读取文件内容。
helloFile = open(‘E:/python/自动化/Task 01 文件自动化处理.py’,encoding=“utf-8”)
helloContent = helloFile.read()
print(helloContent)
结果:helloFile = open(‘E:/python/自动化/Task 01 文件自动化处理.py’,encoding=“utf-8”)
helloContent = helloFile.read()
print(helloContent)
16.readlines()
sonnetFile = open(‘E:/python/自动化/Task 01 文件自动化处理.py’,encoding=“utf-8”)
sonnetFilecontent = sonnetFile.readlines()
print(sonnetFilecontent)
[’\n’, ‘sonnetFile = open(‘E:/python/自动化/Task 01 文件自动化处理.py’,encoding=“utf-8”)\n’, ‘sonnetFilecontent = sonnetFile.readlines()\n’, ‘print(sonnetFilecontent)’]
17.write()
baconFile = open(‘bacon.txt’,‘w’) #打开文件 # 'w’是写模式,改成’a’就是添加模式
baconFile.write(‘Hello world!\n’) #写入内容
baconFile.close() #关闭读写入,最好有这个函数
会创建一个bacon.txt为你教案,然后把内容输入进去

1.4 shelve模块

定义:Shelve是对象持久化保存方法,将对象保存到文件里面,缺省(即默认)的数据存储文件是二进制的。
用途:可以作为一个简单的数据存储方案
使用:只需要使用open函数获取一个shelf对象,然后对数据进行增删改查操作,在完成工作、并且将内存存储到磁盘中,最后调用close函数变回将数据写入文件
shelves存数据:
import shelve
shelfFile = shelve.open(‘mydata’)
cats = [‘Zonphie’,‘Pooka’,‘Simon’]
shelfFile[‘cats’] = cats
shelfFile.close()
shelves取数据
shelfFile = shelve.open(‘mydata’)
shelfFile[‘cats’] #结果:[‘Zonphie’, ‘Pooka’, ‘Simon’]
shelfFile.close()
shelf值有keys()和values()方法
可以用列表的方式操作keys和values的值
shelfFile = shelve.open(‘mydata’)
list(shelfFile.keys()) #[‘cats’]
list(shelfFile.values()) #[[‘Zonphie’, ‘Pooka’, ‘Simon’]]
shelfFile.close()

1.5 pprint.pformat()

将数据保存在.py文件中,将存入数据的文件将成为你自己的模块,如果你需要使用存储在其中的变量,就可以导入它。
import pprint
cats = [{‘name’:‘Zophie’,‘desc’:‘chubby’},{‘name’:‘Pooka’,‘desc’:‘fluffy’}]
pprint.pformat(cats)
fileObj = open(‘myCats.py’,‘w’)
fileObj.write(‘cats = ‘+pprint.pformat(cats)+’\n’)
fileObj.close()
使用存入的数据
import myCats
myCats.cats #[{‘desc’: ‘chubby’, ‘name’: ‘Zophie’}, {‘desc’: ‘fluffy’, ‘name’: ‘Pooka’}]
myCats.cats[0] #{‘desc’: ‘chubby’, ‘name’: ‘Zophie’}
myCats.cats[0][‘name’] #Zophie
练习:
1、如果已有的文件以写模式打开,会发生什么?
打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
2、read()和readlines()方法之间的区别是什么?
read是从到读到尾,读完了再放到一个文件中。返回的是str类型。
readlines是一行一行读,读完一行先存在列表中,知道全部读完。返回的是列表
3.综合练习: 一、生成随机的测验试卷文件 假如你是一位地理老师, 班上有 35 名学生, 你希望进行美国各州首府的一个 小测验。不妙的是,班里有几个坏蛋, 你无法确信学生不会作弊。你希望随机调整 问题的次序, 这样每份试卷都是独一无二的, 这让任何人都不能从其他人那里抄袭答案。当然,手工完成这件事又费时又无聊。 好在, 你懂一些 Python。
下面是程序所做的事:
• 创建 35 份不同的测验试卷。
• 为每份试卷创建 50 个多重选择题,次序随机。
• 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
• 将测验试卷写到 35 个文本文件中。
• 将答案写到 35 个文本文件中。
这意味着代码需要做下面的事:
• 将州和它们的首府保存在一个字典中。
将美国各州首府数据存储在一个字典中
capitals = {‘Alabama’:‘Montgomery’,‘Alaska’:‘Juneau’,‘Arizona’:‘Phoenix’,
‘Arkansas’:‘Little Rock’,‘California’:‘Sacramento’,‘Colorado’:‘Denver’,
‘Connecticut’:‘Hartford’,‘Delaware’:‘Dover’,‘Florida’:‘Tallahassee’}
• 针对测验文本文件和答案文本文件,调用 open()、 write()和 close()。
#创建35份试卷和答案
for quizNum in range(35):
quizFile = open(‘capitalsquiz%s.txt’ % (quizNum + 1), ‘w’)
answerKeyFile = open(‘capitalsquiz_answers%s.txt’ % (quizNum + 1), ‘w’)
# 写标题和开头
quizFile.write(‘Name:\n\nDate:\n\nPeriod:\n\n’)
quizFile.write((’ ’ * 20) + ‘State Capitals Quiz (Form %s)’ % (quizNum + 1))
quizFile.write(’\n\n’)
# 每次循环打乱capital字典
states = list(capitals.keys())
random.shuffle(states)
# 循环states,依据capitals制造9个问题
for questionNum in range(9):
correctAnswer = capitals[states[questionNum]] #得到争取答案
wrongAnswers = list(capitals.values())
del wrongAnswers[wrongAnswers.index(correctAnswer)] # 删除列表中的正确答案,只剩错误答案
wrongAnswers = random.sample(wrongAnswers, 3) #随机取三个错误答案
answerOptions = wrongAnswers + [correctAnswer] #得到这道题的4个答案
random.shuffle(answerOptions) #打乱一下
quizFile.write(’%s. What is the caption of %s\n’ % (questionNum + 1, states[questionNum])) #题目生产
for i in range(4):
quizFile.write(’ %s. %s\n’ % (‘ABCD’[i], answerOptions[i])) #问题选项生产
quizFile.write(’\n’)
answerKeyFile.write(’%s. %s\n’ % (questionNum + 1, ‘ABCD’[answerOptions.index(correctAnswer)])) #答案生成

1.6 组织操作文件

目标:多文件复制、改名、移动或压缩。
shutil模块:
shutil(或称为shell工具)模块中包含一些函数,可以在Python程序中复制、移动、改名和删除文件。

  1. shutil.copy(source, destination):
    将路径source处的文件复制到路径 destination处的文件夹(source 和 destination 都是字符串)
    import shutil
    shutil.copy(‘E:/python/自动化/Task 01 文件自动化处理.py’,‘E:/python/自动化/test1’)

  2. shutil.move(source, destination):
    将路径 source 处的文件/文件夹移动到路径destination,并返回新位置的绝对路径的字符串。
    import shutil
    shutil.move(‘E:/python/自动化/Task 01 文件自动化处理.py’,‘E:/python/自动化/test1’) 移动和改名

  3. os.unlink(path):
    删除path处的文件
    os.unlink(‘E:/python/自动化/capitalsquiz2.txt’) #删除该文件

  4. os.rmdir(path):
    删除path处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
    os.rmdir(‘E:/python/自动化/test1’) #所有文件夹下面的文件都被删除了
    删除文件夹中以什么结尾的文件
    import os
    for filename in os.listdir(‘E:/python/自动化’):
    if filename.endswith(’.txt’):
    #os.unlink(filename)
    print(filename)
    5.shutil.rmtree(path):
    删除 path 处的文件夹,它包含的所有文件和文件夹都会被删除。
    6.将文件删除到垃圾回收站
    import send2trash
    send2trash.send2trash(‘bacon.txt’)
    **7.os.walk(path)😗*生成目录树很多地方都会用到
    传入一个文件夹的路径,在for循环语句中使用os.walk()函数,遍历目录树,和range()函数遍历一个范围的数字类似。不同的是,os.walk()在循环的每次迭代中,返回三个值:当前文件夹称的字符串,当前文件夹中子文件夹的字符串的列表,当前文件夹中文件的字符串的列表。
    import os
    for folderName, subFolders,fileNames in os.walk(’.’):
    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(’’)
    8.zipfile.ZipFile(‘filename.zip’, ‘w’)
    对文件进行压缩
    用法:

1 创建一个new.zip压缩文件,并向其中添加文件

import zipfile
newZip = zipfile.ZipFile(‘new.zip’,‘w’) #将’w’改成’a’就是为压缩包里面添加文件
newZip.write(‘Miki.txt’,compress_type=zipfile.ZIP_DEFLATED)
newZip.close()

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()
读取zip里面的文件
namelis()方法,返回zip文件中包含的所有文件和文件夹的字符串列表。
getinfo()方法,返回一个关于特定文件的ZipInfo对象。
ZipInfo对象的两个属性:file_size和compress_size,分别表示原来文件大小和压缩后文件大小。读取zip文件
import zipfile,os
exampleZip = zipfile.ZipFile(‘new.zip’)
print(exampleZip.namelist())
catInfo = exampleZip.getinfo(‘animals/Miki.txt’)
catInfo.file_size
catInfo.compress_size
print(‘Compressed file is %s x smaller!’ %(round(catInfo.file_size/catInfo.compress_size,2)))
exampleZip.close()
extractall()方法:从zip文件中解压缩所有文件和文件夹,放到当前工作目录中。也可以向extractall()传递的一个文件夹名称,它将文件解压缩到那个文件夹, 而不是当前工作目录。如果传递的文件夹名称不存在,就会被创建。
import zipfile, os
exampleZip = zipfile.ZipFile(‘example.zip’)
exampleZip.extractall(’.\zip’)
exampleZip.close()
exampleZip = zipfile.ZipFile(‘example.zip’)
exampleZip.extract(‘animals/Miki.txt’)
exampleZip.extract(‘animals/Miki.txt’, ‘D:\animals\folders’)
exampleZip.close()
1.1.10 练习
1)、编写一个程序,遍历一个目录树,查找特定扩展名的文件(诸如.pdf 或.jpg)。不论这些文件的位置在哪里, 将它们拷贝到一个新的文件夹中。
import os,shutil
for folderName, subFolders,fileNames in os.walk(‘E:/python/自动化/test1’): #目标目录
for filename in fileNames:
if filename.endswith(’.py’) | filename.endswith(’.zip’): #得到以某种结尾
shutil.copy(os.path.join(os.getcwd(),filename), ‘E:/python/自动化’)
2) 、一些不需要的、 巨大的文件或文件夹占据了硬盘的空间, 这并不少见。如果你试图释放计算机上的空间, 那么删除不想要的巨大文件效果最好。但首先你必须找到它们。编写一个程序, 遍历一个目录树, 查找特别大的文件或文件夹, 比方说, 超过100MB 的文件(回忆一下,要获得文件的大小,可以使用 os 模块的 os.path.getsize())。将这些文件的绝对路径打印到屏幕上。
import os
for file_p , _ , file in os.walk(‘E:/python/自动化/test1’):
for i in file:
if os.path.getsize(os.path.join(file_p,i))>=10010241024:
# print(i)
flag=input(’{}是否删除(y/n):’.format(i))
if flag==‘y’:
os.unlink(os.path.join(‘E:/python/自动化’,i))
else:
pass
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

2. python 自动发送邮件

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.qq.com’ #sina 邮箱smtp服务器 #smtp 服务器的地址
sender_163 = ‘10595570**@qq.com’ #sender_163为发件人的邮箱
pwd = ‘*’ #pwd为邮箱的授权码’DYEPOGLZDZYLOMRI’
#也可以自己注册个邮箱,邮箱授权码’DYEPOGLZDZYLOMRI’ 获取方式可参考#http://help.163.com/14/0923/22/A6S1FMJD00754KNP.html
receiver = '10595570
@qq.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对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值