1、文件处理
环境:window10,工具pycharm
1.1 os.path.join()函数
连接两个或更多的路径名组件 1.如果各组件名首字母不包含’/’,则函数会自动加上 2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃 3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
import os
os.path.join('Datawhale','docu')
1.2 获取当前目录
以当前目录:E:/python/自动化为例子,
import os
os.getcwd()
os.chdir('E:/python/')
os.getcwd()
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程序中复制、移动、改名和删除文件。
-
shutil.copy(source, destination): 将路径source处的文件复制到路径 destination处的文件夹(source 和 destination 都是字符串) import shutil shutil.copy(‘E:/python/自动化/Task 01 文件自动化处理.py’,‘E:/python/自动化/test1’) -
shutil.move(source, destination): 将路径 source 处的文件/文件夹移动到路径destination,并返回新位置的绝对路径的字符串。 import shutil shutil.move(‘E:/python/自动化/Task 01 文件自动化处理.py’,‘E:/python/自动化/test1’) 移动和改名 -
os.unlink(path): 删除path处的文件 os.unlink(‘E:/python/自动化/capitalsquiz2.txt’) #删除该文件 -
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对象
|