1 Python 文件自动化处理

本文详细介绍了Python的文件操作,包括路径处理、读写文件、文件夹操作,以及利用shutil模块进行文件复制、移动和删除。此外,还讲解了如何使用shelve模块保存变量到文件。最后,通过smtplib和email库展示了自动化发送电子邮件的过程,包括发送文本、HTML内容和附件。
摘要由CSDN通过智能技术生成

“”“学习路径均来源于DataWhale”"

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

一、读写文件

1、Return 当前路径

os.getcwd()
'C:\\Users\\jxchen\\Desktop\\python自动化处理'

2、改变当前路径

os.chdir(r"D:\usually_tools")
os.getcwd() # 再次查看当前路径
'D:\\usually_tools'

3、路径转化之 相对路径/绝对路径

"""
`os.path.abspath(path)`:将相对路径转换为绝对路径,将返回参数的绝对路径的字符串。
`os.path.isabs(path)`:判断是否是绝对路径,是返回True,不是则返回False
"""
os.path.abspath('.')  #将相对路径转化为绝对路径
'D:\\usually_tools'
os.path.isabs('.') #判断是否是绝对路径
False
os.path.isabs(os.path.abspath('.'))
True

4、路径操作

"""
`os.path.relpath(path,start)`:返回从start路径到path的相对路径的字符串。如果没提供start,就使用当前工作目录作为开始路径。
`os.path.dirname(path)`: 返回当前路径的目录名称。
`os.path.basename(path)`:返回当前路径的文件名称。
"""
'\n`os.path.relpath(path,start)`:返回从start路径到path的相对路径的字符串。如果没提供start,就使用当前工作目录作为开始路径。\n`os.path.dirname(path)`: 返回当前路径的目录名称。\n`os.path.basename(path)`:返回当前路径的文件名称。\n'
os.path.relpath('D:\\Datawhale\\python办公自动化','D:\\') # 从路径开始处截取后面的字符串
'Datawhale\\python办公自动化'
path = 'D:\\Datawhale\\python办公自动化\\python课程画图.pptx' 
# 返回当前路径的目录名称
os.path.dirname(path)
'D:\\Datawhale\\python办公自动化'
# 返回当前路径的文件名称
os.path.basename(path)
'python课程画图.pptx'
"""
如果同时需要一个路径的目录名称和基本名称,可以调用`os.path.split()`,获得者两个字符串的元组。
"""
'\n如果同时需要一个路径的目录名称和基本名称,可以调用`os.path.split()`,获得者两个字符串的元组。\n'
# 既得到当前路径目录名称又得到文件名称
os.path.split(path)
('D:\\Datawhale\\python办公自动化', 'python课程画图.pptx')
# 切片
os.path.split(path)[0]
'D:\\Datawhale\\python办公自动化'
"""
如果我们想返回每个文件夹的字符串的列表。
用`os.path.split()`无法得到,我们可以用`split()`字符串方法,并根据`os.path.sep` 中的字符串进行分割。
`os.path.sep` 变量设置为正确的文件夹分割斜杠。
"""
print(path)
D:\Datawhale\python办公自动化\python课程画图.pptx
path.split() # 
['D:\\Datawhale\\python办公自动化\\python课程画图.pptx']
os.path.sep
'\\'
path.split(os.path.sep) 
['D:', 'Datawhale', 'python办公自动化', 'python课程画图.pptx']

5、检查路径有效性

"""
如果提供的路径不存在,很多Python函数就会崩溃并报错。
`os.path`模块提供了一些函数,用于检测给定的路径是否存在,以及判定是文件还是文件。
"""
'\n如果提供的路径不存在,很多Python函数就会崩溃并报错。\n`os.path`模块提供了一些函数,用于检测给定的路径是否存在,以及判定是文件还是文件。\n'
os.path.exists(path) # 如果path参数所指的文件或文件夹存在,则返回True,否则返回False。
False
os.path.exists("C:\\") # 如果path参数所指的文件或文件夹存在,则返回True,否则返回False。
True
os.path.isfile(path) # 如果path参数存在,并且是一个文件,则返回True,否则返回False。
False
os.path.isfile(r"C:\Users\xchen\Desktop\0209_jason\0401-0407门禁.xlsx") # 如果path参数存在,并且是一个文件,则返回True,否则返回False。
True
os.path.isdir(path) # 如果path参数存在,并且是一个文件夹,则返回True,否则返回False。
False
os.path.isdir(r"C:\Users\xchen\Desktop\0209_jason") # 如果path参数存在,并且是一个文件夹,则返回True,否则返回False。
True

二、文件及文件夹操作

1、用os.makedirs()创建新文件夹

os.getcwd()
'D:\\usually_tools'
os.makedirs('D:\\Datawhale\\practice') # 创建文件夹
os.path.getsize(r"C:\Users\xchen\Desktop\0209_jason\0529-0531门禁.xlsx") # 返回文件大小
9153841
os.listdir(r"C:\Users\xchen\Desktop\0209_jason") # 返回文件名字符串的列表,包含path参数中的每个文件
['.ipynb_checkpoints',
 '0401-0407门禁.xlsx',
 '0408-0414门禁.xlsx',
 '0415-0421门禁.xlsx',
 '0422-0428门禁.xlsx',
 '0429-0430门禁.xlsx',
 '0501-0507门禁.xlsx',
 '0508-0514门禁.xlsx',
 '0515-0521门禁.xlsx',
 '0522-0528门禁.xlsx',
 '0529-0531门禁.xlsx',
 '输出']
totalSize = 0
"""
如果想知道目录下所有文件的总字节数,可以同时使用`os.path.getsize()`和`os.listdir()`
"""
for filename in os.listdir(r"C:\Users\chen\Desktop\0209_jason"):
    totalSize = totalSize + os.path.getsize(os.path.join(r'C:\Users\chen\Desktop\0209_jason',filename))
print(totalSize)
592523202

2、文件读写过程

"""
1.调用`open()`函数,返回一个File对象。

2.调用File对象的`read()`或`write()`方法。

3.调用File对象的`close()`方法,关闭该文件。
"""
helloFile = open('D:\\Datawhale\\python办公自动化\\hello.txt')
print(helloFile)
<_io.TextIOWrapper name='D:\\Datawhale\\python办公自动化\\hello.txt' mode='r' encoding='cp936'>
2.1、读取文件内容
"""
有了File对象,我们就可以开始从它读取内容。

`read()`:读取文件内容。

`readlines()`:按行读取文件中的内容,取得一个字符串列表,列表中每个字符串是文本中的一行且以\n结束。
"""
'\n有了File对象,我们就可以开始从它读取内容。\n\n`read()`:读取文件内容。\n\n`readlines()`:按行读取文件中的内容,取得一个字符串列表,列表中每个字符串是文本中的一行且以\n结束。\n'
helloFile.read()
'Hello World!'
open('D:\\Datawhale\\python办公自动化\\hello.txt').readlines()
['Hello World!']
helloFile
<_io.TextIOWrapper name='D:\\Datawhale\\python办公自动化\\hello.txt' mode='r' encoding='cp936'>
helloFile.readlines() # 该路径只可以使用read或者readlines使用一次,后面再使用需要重新定义,否则会出现空白
[]
helloFile = open('D:\\Datawhale\\python办公自动化\\hello.txt')
helloFile.readlines()
['Hello World!']
2.2 写入文件内容
"""
需要用“写模式”‘w’和“添加模式”'a'打开一个文件,而不能用读模式打开文件。
“写模式”将覆写原有的文件,从头开始。“添加模式”将在已有文件的末尾添加文本。
"""
open('bacon.txt','w')
<_io.TextIOWrapper name='bacon.txt' mode='w' encoding='cp936'>
os.chdir(r"D:\Datawhale\python办公自动化")
os.getcwd()
'D:\\Datawhale\\python办公自动化'
baconFile = open('bacon.txt','w')
baconFile.write('Hello world!\n')
13
baconFile.close() # 注意,关闭后,才能完成写入,从txt文件中看到写入的内容。
open('bacon.txt','w').write('Hello world!\n') #如果是直接对命令操作则不需要关闭
13
open('bacon.txt','a').write('Hello world! second\n') #如果是直接对命令操作则不需要关闭
20
open('bacon.txt').readlines() # 读出写入内容
['Hello world!\n', 'Hello world! second\n']

3、保存变量

1、shelve模块
"""
用`shelve`模块,可以将Python中的变量保存到二进制的`shelf`文件中。
这样,程序就可以从硬盘中恢复变量的数据。
"""
import shelve
shelfFile = shelve.open('mydata')
cats = ['Zonphie','Pooka','Simon']
shelfFile['cats'] = cats
shelfFile.close()
"""
在Windows上运行前面的代码,我们会看到当前工作目录下有3个新文件:mydata.bak、mydata.dat和mydata.dir。
"""
shelfFile = shelve.open('mydata')
type(shelfFile)
shelve.DbfilenameShelf
shelfFile['cats']
['Zonphie', 'Pooka', 'Simon']
shelfFile.close()

4、组织文件

在上一节中,已经学习了如何使用Python创建并写入新文件。本节将介绍如何用程序组织硬盘上已经存在的文件。不知你是否经历过查找一个文件夹,里面有几十个、几百个、甚至上千个文件,需要手工进行复制、改名、移动或压缩。比如下列这样的任务:

• 在一个文件夹及其所有子文件夹中,复制所有的 pdf 文件(且只复制 pdf 文件)

• 针对一个文件夹中的所有文件,删除文件名中前导的零,该文件夹中有数百个文件,名为 spam001.txt、 spam002.txt、 spam003.txt 等。

• 将几个文件夹的内容压缩到一个 ZIP 文件中(这可能是一个简单的备份系统)

所有这种无聊的任务,正是在请求用 Python 实现自动化。通过对电脑编程来完成这些任务,你就把它变成了一个快速工作的文件职员,而且从不犯错。

4.1 shutil模块

shutil(或称为shell工具)模块中包含一些函数,可以在Python程序中复制、移动、改名和删除文件。要使用shutil的函数,首先需要import shutil

shutil.copy(source, destination):将路径source处的文件复制到路径 destination处的文件夹(source 和 destination 都是字符串),并返回新复制文件绝对路径字符串。

其中destination可以是:

1)、一个文件的名称,则将source文件复制为新名称的destination

2)、一个文件夹,则将source文件复制到destination中

3)、若这个文件夹不存在,则将source目标文件内的内容复制到destination中,若destination文件夹不存在,则自动生成该文件。(慎用,因为会将source文件复制为一个没有扩展名的名字为destination的文件,这往往不是我们希望的)

import shutil
shutil.copy('D:\\Datawhale\\python办公自动化\\bacon.txt', 'D:\\Datawhale\\practice')
'D:\\Datawhale\\practice\\bacon.txt'
os.getcwd()
'D:\\Datawhale\\python办公自动化'
shutil.copy('D:\\Datawhale\\python办公自动化\\hello.txt', 'D:\\Datawhale\\practice\\hello.txt') # 将文件从第一个路径,复制到第二个路径
'D:\\Datawhale\\practice\\hello.txt'
shutil.copy('D:\\Datawhale\\python办公自动化\\bacon.txt', 'D:\\Datawhale\\practice\\bacon.txt') # 将文件从第一个路径,复制到第二个路径
'D:\\Datawhale\\practice\\bacon.txt'
shutil.copy('D:\\Datawhale\\python办公自动化\\bacon.txt', 'D:\\Datawhale\\exercise.txt')
'D:\\Datawhale\\exercise.txt'

shutil.copytree(source, destination) :将路径source处的文件夹,包括其包含的文件夹和文件,复制到路径destination处的文件夹,并返回新复制文件夹绝对路径字符串。

注:destination处的文件夹为新创建的文件夹,如已存在,则会报错

shutil.copytree('D:\\Datawhale\\python办公自动化','D:\\Datawhale\\practice\\test') 
# 将python办公自动化文件夹下的所有文件,复制到practice\\test中
'D:\\Datawhale\\practice\\test'
4.2文件和文件夹的移动与改名

shutil.move(source, destination):将路径 source 处的文件/文件夹移动到路径destination,并返回新位置的绝对路径的字符串。

1)、如果source和destination是文件夹,且destination已存在,则会将source文件夹下所有内容复制到destination文件夹中。移动。

2)、如果source是文件夹,destination不存在,则会将source文件夹下所有内容复制到destination文件夹中,source原文件夹名称将被替换为destination文件夹名。 移动+重命名

3)、如果source和destination是文件,source处的文件将被移动到destination处的位置,并以destination处的文件名进行命名,移动+重命名。

注意:如果destination中有原来已经存在同名文件,移动后,会被覆写,所以应当特别注意。

shutil.move('D:\\Datawhale\\docu','D:\\Datawhale\\practice') # 对文件名进行更改
'D:\\Datawhale\\practice'
shutil.move('D:\\Datawhale\\practice','D:\\Datawhale\\docu') # 对文件名进行更改
'D:\\Datawhale\\docu'
shutil.move('D:\\Datawhale\\docu\\bacon.txt','D:\\Datawhale\\docu\\egg.txt')
'D:\\Datawhale\\docu\\egg.txt'
4.3 永久删除文件和文件夹

os.unlink(path): 删除path处的文件。

os.rmdir(path): 删除path处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。

shutil.rmtree(path):删除 path 处的文件夹,它包含的所有文件和文件夹都会被删除。

注意:使用时,需要非常小心,避免删错文件,一般在第一次运行时,注释掉这些程序,并加上print()函数来帮助查看是否是想要删除的文件。

"""python
#建议先指定操作的文件夹,并查看
os.chdir('D:\\Datawhale\\docue')
os.getcwd()
"""

for filename in os.listdir():
    if filename.endswith('.dir'):
        #os.unlink(filename)
        print(filename)

mydata.dir
os.getcwd()
'D:\\Datawhale\\python办公自动化'
os.listdir()
['bacon.txt', 'hello.txt', 'mydata.bak', 'mydata.dat', 'mydata.dir']

5 自动发送电子邮件

使用Python实现自动化邮件发送,可以让你摆脱繁琐的重复性业务,节省非常多的时间。

Python有两个内置库:smtplibemail,能够实现邮件功能,smtplib库负责发送邮件,email库负责构造邮件格式和内容。

邮件发送需要遵守SMTP协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

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   #邮件的文件头,标题,收件人
host_server = 'email.qq.com' # 邮箱smtp服务器                 #smtp 服务器的地址
sender_163 = 'xchen@qq.com'                   #为发件人的邮箱
pwd = ''                    #pwd为邮箱的授权码''
receiver = 'xchen@qq.com'     
msg = MIMEMultipart() 
mail_title = 'python办公自动化邮件'   # 邮件标题
msg["Subject"] = Header(mail_title,'utf-8')  #装入主体
msg["From"] = sender_163           #寄件人
msg["To"] = Header("测试邮箱",'utf-8') #标题
mail_content = "您好,这是使用python登录163邮箱发送邮件的测试"   #邮件的正文内容
message_text = MIMEText(mail_content,'plain','utf-8')   #构造文本,参数1:正文内容,参数
msg.attach(message_text)    # 向MIMEMultipart对象中添加文本对象
"""
image_data = open('cat.jpg','rb')   # 二进制读取图片
message_image = MIMEImage(image_data.read())  # 设置读取获取的二进制数据
image_data.close()       # 关闭刚才打开的文件
msg.attach(message_image)  # 添加图片文件到邮件信息当中去
"""
"\nimage_data = open('cat.jpg','rb')   # 二进制读取图片\nmessage_image = MIMEImage(image_data.read())  # 设置读取获取的二进制数据\nimage_data.close()       # 关闭刚才打开的文件\nmsg.attach(message_image)  # 添加图片文件到邮件信息当中去\n"

atta = MIMEText(open(r'C:\Users\xchen\Desktop\离职数据.xlsx', 'rb').read(), 'base64', 'utf-8')   # 构造附件
# atta["Content-Disposition"] = 'attachment; filename="cat.xlsx"'  # 设置附件信息
msg.attach(atta)       ## 添加附件到邮件信息当中去
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对象


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值