来源 | 数据分析与统计之美
作者 | 1_bit
在计算机中,编写程序需要使用计算机编程语言。由于种类和特殊性不同,计算机语言有上百种。那么,随着办公需求越来越复杂,什么语言可以提高我们的办公效率呢?
Python 作为最流行的语言之一,拥有许多强大的第三方库来支持它。换句话说,这些库都是已经实现好的函数,等着你去使用它们来完成你所需要的定制功能。我们只需要学习 Python 的基本语法,就可以提高我们在办公室的工作效率。
今天的文章将以模拟解决10个办公需求为主要内容,让大家感受一下Python的魅力。本文将要解决的10个办公需求如下:
上班第一天
上班第一天,老板给你一堆文本文件,让你把里面的电话号码提取出来。如果是普通的上班族,你会一个个的搜索文本文件来获取信息,但在今天电脑深度渗透的时代,这显然是提高办公效率、解放自我的更好选择。
首先我们可以认为文本文件是一个后缀名为txt的文件,这个文本文件首先需要被读取,读取文本信息需要用到Python的open函数。此时创建一个名为day1.py的Python文件,编写一个名为get_str的函数,并将需要读取的文件路径作为参数传入,函数返回读取的内容。函数代码如下:
#读取目标文本文件
def get_str(path):
f = open(path,encoding="utf-8")
data = f.read()
f.close()
return data
现在读取文本内容的函数已经写好了,接下来就是从读取的值中提取电话号码了。提取电话号码,我们使用正则表达式,这里就不解释如何使用正则表达式了,使用正则表达式需要使用re模块,导入re模块后,调用re模块的findall方法读取电话号码然后返回:
import re
#正则获取文本号码
def get_phone_number(str):
res = re.findall(r'(13\d{9}|14[5|7]\d{8}|15\d{9}|166{\d{8}|17[3|6|7]{\d{8}|18\d{9})', str)
return res
然后最后一步就是保存信息了,保存信息需要创建一个名为save_res的函数,传入两个参数,提取号码的结果和保存文件的路径,然后遍历结果并使用write方法写入,函数代码如下:
#保存得到号码
def save_res(res,save_path):
save_file = open(save_path, 'w')
for phone in res:
save_file.write(phone)
save_file.write('\n')
save_file.write('\n号码共计:'+str(len(res)))
save_file.close()
print('号码读取OK,号码共计:'+str(len(res)))
最后一步就是调用创建的代码,使用input接收两个输入值,一个是需要读取的目标文件路径,一个是保存结果的文件路径,然后依次调用函数,代码如下:
path=input("请输入文件路径:")
save_path=input("请输入文件保存路径:")
#read_str=get_str(path)
res=get_phone_number(get_str(path))
save_res(res,save_path)
此时我们建立一个txt文件用于测试,文件名及后缀为phone.txt,内容为:
张三:15888888888
李四:15888888888
王五:15888888888
草帽:15888888888
李四:15888888888
柳叶:15888888888
柳叶:15888888888
李四:15888888888
柳叶:15888888888
柳叶:15888888888
李四:15888888888
柳叶:15888888888
柳叶:15888888888
李四:15888888888
柳叶:15888888888
李四:15888888888
李四:15888888888
柳叶:15888888888
接下来在DOS下运行Python文件day1,输入文件存放路径和保存路径,当信息提取完成后会有提示:
现在检查保存的文件res.txt,发现电话号码信息已经被提取出来了:
至此,第一天的工作就轻松完成了,还可以把剧本分享给同事,提升自己的形象,是不是很棒呢?
上班第二天
上班第二天,你被分配了一项任务,就是用Excel保存第一天的phone.txt文本。如果文本包含数万条信息,手动完成这项任务可能需要非常长的时间,而且很有可能会遗漏一些信息。
这时候用Python做自动化会大大减少你的操作时间,而且程序正确的话,数据缺失的概率极低。那么Python能胜任第二天的功能吗?答案当然是“能!”。Python有一个第三方库叫xlwt,可以自动将数据保存到Excel文件中。接下来我们来看看如何解决。
首先,创建一个名为day2.py的Python文件,并在文件头中导入xlwt:
import xlwt
由于我们当前需要的数据是用于第一天的任务的,所以我们继续使用第一天用到的get_str函数:
#读取目标文本文件
def get_str(path):
f = open(path,encoding="utf-8")
data = f.read()
f.close()
return data
接下来我们创建一个名为save_excel的函数,该函数包括保存文件、设置sheet名、设置列名、设置列值等功能。save_excel函数接收四个参数,分别是save_path、sheetname、column_name_list、content。首先我们在函数中创建一个Workbook对象:
def save_excel(save_path,sheetname,column_name_list,read_list):
workbook = xlwt.Workbook()
然后在函数体中使用add_sheet添加sheet,add_sheet函数接收一个sheet名称的参数,我们将接收到的sheetname参数作为sheetname的值,add_sheet函数会返回创建的sheet对象,代码写法如下:
sheet1 = workbook.add_sheet(sheetname=sheetname)
接收到参数之后,我们可以使用for循环将传递的列名column_name_list设置到sheet上:
for i in range(0,len(column_name_list)):
sheet1.write(0,i,column_name_list[i])
上述代码中,write方法第一个参数是sheet的行,这里的0表示第一行;参数i表示列,因为i从0开始到当前列元素的长度去遍历column_name_list,这次是从0开始到column_name_list的最后一个元素,那么从第一列到对应最后一列的所有列名都会填入sheet页眉中。
接下来我们应该为这些列设置元素,这时候我们遍历传递过来的read_list,里面就是这些列的具体内容,比如姓名、电话号码等,这时候我们遍历read_list,由于原始数据每一行都会用姓名和电话号码来分隔,比如“张三:”,所以我们在遍历read_list的时候应该再次将值分开,赋值方式和列名设置一样,这里就不再赘述了,代码如下:
i=1
for v in read_list:
kval=v.split(':')
for j in range(0,len(kval)):
sheet1.write(i+1,j,kval[j])
print(kval[j])
i=i+1
最后使用workbook对象调用save方法,并传递保存地址,save_excel自定义函数完整代码如下:
#保存为Excel文件
def save_excel(save_path,sheetname,column_name_list,read_list):
workbook = xlwt.Workbook()
sheet1 = workbook.add_sheet(sheetname=sheetname)
for i in range(0,len(column_name_list)):
sheet1.write(0,i,column_name_list[i])
i=1
for v in read_list:
kval=v.split(':')
for j in range(0,len(kval)):
sheet1.write(i+1,j,kval[j])
i=i+1
workbook.save(save_path)
print('信息保存 OK,记录条数共计:'+str(len(read_list)))
到此,主要函数已经写好了,接下来我们要接受用户输入的文件路径、文件保存路径、sheetname、列名,并使用换行符“\n”作为原始数据的列表分隔符,代码如下:
path=input("请输入文件路径:")
save_path=input("请输入文件保存路径:")
sheet_name=input("请输入sheetname:")
column_name=input("请输入列名,并且使用英文逗号隔开:")
column_name_list=column_name.split(',')
read_str=get_str(path)
read_list=read_str.split('\n')
save_excel(save_path,sheet_name,column_name_list,read_list)
现在运行day2.py文件,输入所需内容,就会出现成功提示:
然后可以在保存的文件中看到提取的信息:
上班第三天
第三天,老板给你布置了一项任务:从文本中提取邮箱地址。这项任务和第一项类似,我们只需要替换正则表达式即可完成任务。创建一个名为 day3.py 的 Python 文件。day3.py 完整代码如下:
import re
#正则获取目标信息
def get_re_str(str):
res = re.findall(r'^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', str)
return res
#读取目标文本文件
def get_str(path):
f = open(path,encoding="utf-8")
data = f.read()
f.close()
return data
#保存得到的信息
def save_res(res,save_path):
save_file = open(save_path, 'w')
for phone in res:
save_file.write(phone)
save_file.write('\n')
save_file.close()
print('信息读取OK,信息共计:'+str(len(res)))
path=input("请输入文件路径:")
save_path=input("请输入文件保存路径:")
#read_str=get_str(path)
res=get_re_str(get_str(path))
save_res(res,save_path)
上面的代码中,我们修改了一些函数名以及必要的正则信息,使得函数功能与名称一一对应。这里我们已经知道,如果想从一段文本中提取常用信息,只需要修改对应的正则表达式即可。如果不知道正则表达式怎么写,可以用搜索引擎搜索,直接替换即可完成功能。这里针对邮箱的正则表达式为 '^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$'。我们现在运行文件,填入必要的输入信息,即可提取对应文本中的邮箱文本信息。
上班第四天
今天是第四天,前三天你做的已经很不错了,自然上级会更加看重你,这时候上级给你一个G的压缩包,告诉你里面的图片都要加水印,这个功能要怎么实现呢?
当然,你可以通过其他软件付费,但你很可能自己支付这几十美元。现在你已经学会了 Python 并完成了一些任务,你应该寻找 Python 的相关支持库。如果你已经开始寻找相关的 Python 支持,我可以告诉你“恭喜你!你的想法非常正确。”你可以使用 Python 的 opencv 库来完成这个操作。
安装完opencv库之后,导入opencv库,引入os,因为我们接下来要对某个文件夹下的文件进行批量水印操作,会涉及到目录文件读取:
import cv2
import os
接下来根据用户输入的路径判断需要操作的目录下的图片:
path=input("请输入需要加水印的文件夹路径:")
然后获取目录中的所有文件:
file_list = os.listdir(path)
最后循环遍历每张图片,使用imread方法读取图片获取图像对象,使用putText方法为图像对象添加水印信息,水印信息参数已经在注释中说明。最后使用imwrite方法保存图片:
for filename in file_list:
img1 = cv2.imread(path+filename,cv2.IMREAD_COLOR)
cv2.putText(img1,'CSDN',(10,10) , 1, 1, (255,255,255),1) #图片,文字,位置,字体,字号,颜色,厚度
cv2.imwrite(path+filename, img1)
运行程序并输入路径后,最终生成的图像结果如下:
上班第五天
你在公司已经小有名气了,上司告诉你,“你之前同事的电脑里重复文件太多,导出的文件也太多,需要删除重复文件。”这个任务交给你,那么如何删除重复文件呢?
没错,就是用文件的md5值来比对,相同文件的md5值是相同的,只需要遍历目录下文件的md5值,如果出现重复的md5,就删除该文件。
第一步导入两个模块,其中hashlib作为md5计算所需的模块:
import hashlib,os
接下来编写一个需要传入文件路径的函数来获取文件的md5:
def getMD5(filepath):
f = open(filepath,'rb')
md5obj = hashlib.md5()
md5obj.update(f.read())
hash = md5obj.hexdigest()
f.close()
return str(hash).upper()
上述代码中,hashlib.md5()用于获取md5加密的对象,md5obj.update()用于指定加密后的信息,最后md5obj.hexdigest()用于获取加密后的十六进制字符串。至此,就可以获取到md5加密后的十六进制字符串,最后返回。接下来,我们需要让用户进入需要过滤重复文件的目录:
path=input("请输入需要重复文件过滤文件夹路径:")
然后获取目录下的文件信息,并建立列表记录md5值:
file_list = os.listdir(path)
file_md5=[]
然后使用for循环遍历指定目录:
for filename in file_list:
md5val=getMD5(path+filename)
if md5val in file_md5:
os.remove(path+filename)
else:
file_md5.append(md5val)
print("处理完毕...")
上述代码中,调用getMD5方法获取文件的md5值,然后判断md5值是否在记录列表中,如果在则使用os的remove方法移除该文件,否则将md5值记录下来,这样就实现了删除重复文件的操作。
运行程序后,进入目录,重复文件会被清理:
上班第六天
今天你的领导跟你说,他们需要看作者写的汉字数才能付稿费,但他们只能数汉字,听说以前实习生被要求数得慢,所以希望你能加快数汉字的速度。
当然,对于只使用过几天 Python 的你来说,这是很简单的操作。要完成这个需求,我们需要用到两个 Python 模块,一个是 os,一个是 re。os 用于读取文本信息,re 用于判断汉字。我们先创建一个名为 get_str 的函数,该函数接收文本路径作为参数,然后返回文本信息。函数实现如下:
#读取目标文本文件
def get_str(path):
f = open(path)
data = f.read()
f.close()
return data
接下来输入目标路径代码:
path=input("请输入文件路径:")
接下来我们只需要使用re模块中的findall方法就可以提取了,在findall方法中我们指定汉字范围为\u4e00-\u9fa5:
path=input("请输入文件路径:")
word=re.findall('([\u4e00-\u9fa5])',get_str(path))
print("中文字符,除特殊字符外共:",len(word))
最后我们将需要统计的内容复制到一个文本文件中,运行脚本,结果如下:
工作第七天
今天艺术家跟你说她需要官网的二维码来做海报,但是不知道去哪拿,需要你的帮助,你让她稍等一下,然后就立马发给她了,你是怎么做到的?
在Python中,有一个库叫qrcode,可以直接对指定的URL生成二维码,首先介绍一下qrcode库。
import qrcode
然后设置创建二维码所需的具体信息,如大小、尺寸、公差等,代码和注释如下:
qr = qrcode.QRCode(
version=2,#尺寸
error_correction=qrcode.constants.ERROR_CORRECT_L,#容错信息当前为 7% 容错
box_size=10,#每个格子的像素大小
border=1#边框格子宽度
)#设置二维码的大小
然后指定URL,生成二维码图片,最后保存:
qr.add_data("https://www.csdn.net/")#指定 url
img = qr.make_image()#生成二维码图片
img.save("F:\work\day7\csdn.png")#保存
运行脚本,生成csdn官网链接:
上班第八天
上班第八天到了,你的技术得到了领导和同事的认可,同事小王找你做一个GIF图,他不会做,但是手头有好几张图片,你立马答应了。
小王给你一个文件夹,里面是按顺序排列的图片,你需要根据需要制作动画图片,为了方便,我们以下面两张图片为例:
这时候需要的Python库是imageio,使用这个库可以很方便的将多张图片生成gif图。首先我们需要一个列表来存储图片路径,为了演示方便,我们直接使用列表作为存储,并创建一个变量来存储图片路径:
import imageio
image_list = [r'F:\work\day4\1.png', r'F:\work\day4\2.png']
gif_name = r'F:\work\day4\gif.gif'
接下来创建一个列表,用于存储读取的图片信息,方便合成gif图片:
frames = []
然后遍历图片路径,然后使用imageio的imread方法读取图片并添加到frames列表中:
for image_name in image_list:
frames.append(imageio.imread(image_name))
接下来使用imageio的mimsave方法传入gif_name保存路径信息、frames图片信息、'GIF'生成图片类型、以及切换gif图片的duration参数2:
imageio.mimsave(gif_name, frames, 'GIF', duration=2)
最后运行脚本,获取gif图像。
上班第九天
第九天到了,今天早上人事部说需要你把一份文件翻译成中文,质量不用太好,但必须快点,你还是毫不犹豫的答应了。
Python中有一个库叫translate,可以直接翻译英文文本,我们先导入这个库:
from translate import Translator
然后设置翻译的语言类型:
translator = Translator(to_lang="Chinese")
接下来设置翻译的语言文本,这里我们创建一个函数来直接获取文本信息:
def get_str(path):
f = open(path)
data = f.read()
f.close()
return data
然后要求用户输入文件路径并获取文件文本:
path=input("请输入文件路径:")
text=get_str(path)
文字信息为:
Virtual Group Coaching: How to Improve Group Relationships in Remote Work Settings
最关键的一步就是将文本翻译进translate方法并输出:
translation = translator.translate(text)
print(translation)
最后我们运行脚本,得到结果:
工作第十天
第十天,老板给了你一个视频文件,希望你能提取音频,老板很器重你,还说今天转正后会提前升职加薪,你也很激动,直接用3行代码就提取出了指定视频的音频。
Python可以使用moviepy库来操作视频,第一步是引入moviepy:
from moviepy.editor import AudioFileClip
然后使用AudioFileClip获取视频信息:
my_audio_clip = AudioFileClip("E:\PyVedio\py02.mp4")
最后直接使用方法将视频的音频写入文件中:
my_audio_clip.write_audiofile("E:\PyVedio\py02.wav")
见识了Python这么多的“神奇”用法,何不尝试一下呢?
-结尾-