前言及工具安装:
不管小白也好,还是刚学有成,这篇文章一定对你有用。只要跟着以下实现的步骤流程,能耐心的看下去,即使是小白,也能学会这项技能。因为这些都是很基础的知识,不需要太多的逻辑实现,更谈不到什么数据结构算法,所以学习起来不枯燥、不会感到辛苦和吃力,能让学了马上学有所成,同样能获得成就感爆棚的一项技能。在此学习之前,建议至少先安装好运行代码的工具,比如纯小白学习的话,这款VSCode编辑器工具更为推荐,原因就是它兼容性算比较好,不用下载安装各种模块包,而且直接下载安装搞定。
如果遇到安装问题不知道怎么处理的,免得在网上到处找资料,到处碰壁,有兴趣的可以看下我的这篇文章,是专讲Python工具的安装教程(超详细),包括pycharm、anaconda这两款硬核工具,如果还是不能解决的,「可以通过评论,看到,会第一时间解决」:
详解Python软件安装教程和配置,小白都能看懂的教程,值得收藏
对于正在工作中的白领也好还是正在上大学的大学生也好,学好一门编程语言,尤其是Python这门语言,在职场上是很有价值的,一来可以提高职场竞争力,二来可以提升工作效率。语言的本质它就是一个工具,我们得会用它,毕竟“工欲善其事必先利其器”。
每个打工者都知道,在工作上,本来要加班到很晚或者是要忙到几天几夜才能完成的工作报表,因为哪天会了python这门技术,会利用这个工具,结果还能提早下班,可以留出那么多的时间去做自己喜欢做的事情。同时还更能让老板看重和同事们的羡慕。不管做运营的,还是财务部门的,还是人力资源部的等等行业,善于利用Python做些自动化办公的技术活岂不是很吃香?(不仅加薪升职,更是精神上的解脱)
工作中碰到最多的无非就是Excel表格和一些普通文件的处理,尤其数量庞大且数据复杂的情况,整理起来会有让人有种快疯狂的节奏。真的是神累、心更累,为了能够解决工作上,对这些问题的困扰,以下谈两个场景,说不定哪天就派上用场了。
一、实现.txt文件要求:
比如,有一天,老板发给了你一个邮件,邮件里面有一个压缩文件,通过下载到电脑之后,你高高兴兴的对文件解压并点开一看,发现文件打开来是成千上万的文件,文件类型也很多,包括了.txt后缀的普通文档,图片(png,jpg,jpeg等格式).csv,.xlsx,压缩包,配置文件等等类型文件,你除了叹气还是叹气。
这时候,比如老板要求叫你,给我找到文件内容信息中要包含有“西瓜”这个关键词的文件,而且要求是.txt文件的,给我整理出来,同时并把这个文件的路径地址一同做成文件发给我。
想想,成千上万的文件,而且要求里面的内容包含老板想要的关键词(西瓜),这时候,难道要对.txt的文件一个一个打开,然后不断去搜索,做复制粘贴的重复性工作吗?如果几千几万个文件,估计加一两个晚上的班,这样的效率不太可能完成,就算可以,也会有出错,或者少漏等情况,毕竟是人工审核。既然如此,我们得想到最好的方法,用工具代替人工,实现更准更快的方法,代替我们双手和精神上的解放吧。
实现步骤流程:
对于这个问题,其实很简单,说了那么多的介绍,接下来干货开始吧,具体看步骤。对于文件的操作,首先是需要先导入“os”这个包,在Python里,os是个标准库,不需要安装,直接拿来使用即可。python的格式,如下所示:
步骤1:
importos#导入os模块
步骤2:
设置保存文件路径,先把老板发的文件存放到任何一个盘符下,如果是在工具上操作,可以放在工具的同一个文件中,这个就取相对路径即可./xxxxx格式的,也可以放在任何盘符,这个就需要取它的绝对路径。在python中,绝对路径的书写方式常用的有两种:
第1种:"C:/Users/zhangSan/Desktop/1.csv"
第2种:"C:\\Users\\zhangSan\\Desktop\\1.csv"
我保存的是在F盘下,所以我就创建一个文件:
path="F:\\TEST\\"#创建文件路径
步骤3:
目的是要找到.txt类型的文件,前提我们要先提取出来文件的名称,这个提取方法,咱们用filenames用来保存所有文件名称的,看代码:
filenames=os.listdir(path)#获取读取文件的名称
通过三个步骤,就可以取到所有文件的名称了,整个代码如下所示:
importospath="D:\\"#为了测试的,这个随意,文章所写要做的是在F盘下filenames=os.listdir(path)print(filenames)#打印所有文件名称
结果就把D盘所有文件的名称都打印出来了,如下图所示:
步骤4:
咱们把老板要求文件里要有西瓜关键词的这个问题,让用户自己去输入的方式来实现,这里要用到一个函数,"input",代码即如下:
key_word=input("请输入你要查找的关键词:")
步骤5:
到了这一步,需要创建一个命名为result_melon.txt(随便命名)的文件来保存含有西瓜关键词的“.txt后缀”的文件,这里以追加方式打开文件:
result_melon=open("F:\\result_melon.txt",a,encoding="utf-8")
步骤6:
通过遍历读取到所有的文件名称,用for循环,代码如下所示:
forflienameinfilenames:#fro循环遍历
步骤7:
因为我们要的是".txt"后缀的文件,所以这里需要用一个if判断语句,来判断在文件名称中是否存在后缀名为.txt的文件,代码如下所示:
if".txt"infilename:#判断在文件名称中是否存在后缀名为.txt的文件
为了确定是否正确,可以先让其在终端上显示出来,可以输入打印以下信息:
print("找到文件了:"+filename)#如果.txt文件存在,就打印出来
到了这里,仅仅是找到了文件而已,而我们要的是这个文件的整个文件路径,所以需要做拼接处理,拼接成完整的文件相对路径,保存到为“target”命名(命名随意)的的目标文件中,代码如下所示:
target=path+filename#拼接成完整的文件相对路径
步骤8:
这一步需要打开读取文件,编码格式为“utf-8”,代码如下所示:
file=open(target,"r",encoding="utf-8")#打开文件
文件的读取,用read()函数,假设用contents来保存.txt文件中包含的所有信息内容,代码如下所示:
contents=file.read()#读文件
最后,有打开文件,就必须要记得关闭文件,代码如下所示:
file.close()#关闭文件
步骤9:
知道了所有.txt文件包含的信息,要求是要找到“西瓜”关键词的,所以很好办,还是利用if判断语句就能解决了。即判断输入的关键词是否存在.txt的文件内容当中,因为我们的关键词是通过用户输入的,代码可以这么写:
ifkey_wordincontents:#判断输入的关键词是否在内容中
为了能够确认是否合乎要求,可以将信息打印出来看看,比如:
print("真给力,目标文件{}中,包含了{}这个关键词。".format(target,key_word))
其中的.format()函数是用来格式化处理,它增强了字符串格式化的功能,代替以前的“%”形式,可以接受不限个参数,位置可以不按顺序,这些了解一下即可。
最后,确定了存在西瓜关键词存在.txt文件当中,那么为了要求的目的,将这个目标文件写入到result_melon中,写入文件用到write()函数,把读取到的文件写入要保存的文件当中,并且以换行显示,代码如下所示:
result_melon.write(target+"\n")#写入文件
步骤10:
这也是最后一步,因为在一开始时,创建并打开了一个命名为result_melon.txt的文件,在完成所有需求操作后,需要关闭文件的操作。
result_melon.close()#关闭文件
好了,到这里,所有的要求条件就都满足了,接下来,看看整体代码是怎么写的?如下所示:
importos#导入标准库path="F:\\TEST\\"#创建文件路径filenames=os.listdir(path)#获取读取文件的名称#用户输入信息key_word=input("请输入你要查找的关键词:")#创建一个命名为result_melon.txt的文件,以追加方式打开文件result_melon=open("F:\\result_melon.txt",a,encoding="utf-8")#遍历读取到的文件名称forfilenameinfilenames:#判断在文件名称中是否存在后缀名为.txt的文件if".txt"infilename:#找到则打印以下信息print("找到文件了:"+filename)#拼接成完整的文件相对路径,保存到为target的目标文件中target=path+filenamefile=open(target,"r",encoding="utf-8")#打开并读取文件contents=file.read()#contents为.txt文件中包含的所有信息内容file.close()#关闭文件#判断输入的关键词是否存在.txt的文件内容当中ifkey_wordincontents:#存在则打印以下信息print("真给力,目标文件{}中,包含了{}这个关键词。".format(target,key_word))result_melon.write(target+"\n")#把读取到的文件写入要保存的文件当中,并且换行显示result_melon.close()#关闭文件
通过在pycharm编辑器上运行之后,结果如下图所示:
说明代码方面没有任何问题,这时而在目录下也多了一个result_melon.txt的文件,文件打开可以看到,这里面的文件路径“F:\TEST\.txt”是存放了包含“西瓜”关键词的文件完整路径,只有包含“西瓜”关键词的才会保存在这个文件里,如下图所示:
二、实现csv文件要求:
有一天,你的上司同样发了一封邮件给你,在还没来得及下载打开,这时leader并带着微笑向你走来,告诉你说:“好同志,我发给你的一份csv表格里,是咱们公司几万员工的职位表都包含在里面,现在急要,麻烦你把每个员工做成单独的csv表格放到一个文件夹,压缩后发给我”。几万份,听着很夸张,于是你打开看看,类似这样的表格。
而上司的要求是这样的:
如果换做是你,你会怎么办?几万份不是个小数目,难道要每个都新建新的一张表格,然后复制粘贴吗?这样不仅效率低下,或容易导致输错或疏漏等情况,也容易让人崩溃到极点的地步。按几万份的量来说,靠着复制粘贴的方法,几个晚上也难免能完成得了,而如果通过python,仅前提写好十几二十行代码量,就能分分钟搞定,这样的效率且高,不易出错或疏漏的问题。好,咱们开始看如何来实现的吧。
实现步骤流程:
步骤1:
同样的需要导入csv模块,Python自带了csv模块,提供用户对csv文件进行读写的操作,命令如下所示:
importcsv#导入csv模块
下面这是一张测试实验的csv表格,感兴趣的可以拿来一样来测试下,如下表:
可以将保存到csv表格文件当中,将这个文件保存到任意盘符都行,我的是放在电脑桌面,设置保存文件路径:
employee_path=C:/Users//Desktop/员工职位表.csv#设置保存文件路径
因为还有制作一份文件夹来保存这所有员工的csv表格,所以还需要再设置存放所有员工表的文件路径,这里我同样存放在电脑桌面,将文件夹命名为demo:
employees_path=C:/Users//Desktop/demo/#设置存放所有员工表的文件路径
步骤2:
以“读”的方式打开员工职位表这个文件,这里利用:withopen()asfile:的格式,为什么要这么写,不像上面打开文件的写法,这样的写法主要是为了解决在读写打开文件后有时候忘记了close()关闭文件的操作。具体使用方法,如下是官方文档中给出的一个例子:
importcsvwithopen(names.csv,newline=)ascsvfile:...reader=csv.DictReader(csvfile)...forrowinreader:...print(row[first_name],row[last_name])...EricIdleJohnCleeseprint(row)OrderedDict([(first_name,John),(last_name,Cleese)])
「有个值得注意的地方」:
在函数里面的参数书写格式里,还要注意编码的格式,如果保存的是“utf-8”的格式,就必须写上编码格式,但最好不要仅仅写“utf-8”:如这样:
withopen(names.csv,encoding="utf-8",newline=)ascsvfile:
最好是写"utf-8-sig",这样的写法:
withopen(names.csv,encoding="utf-8-sig",newline=)ascsvfile:
为什么utf-8编码后面要带个“-sig”?主要原因是为了解决多出了一个非法字符("\ufeff"),否则会造成读写失败。具体为什么就别管太多了,知道这么用就行了。
但是这个演示的csv表格文件,是没另存为utf-8格式的,所以不需要加上编码格式,否则会报这样的错误提示:
UnicodeDecodeError:utf-8codeccantdecodebyte0xc3inposition0:invalidcontinuationbyte
正确的这么写即可:
withopen(employee_path,r,newline=)asemployee_file:#以读的方式打开文件
到这一步,当然是读取文件了,将文件对象转换为DictReader对象。有人要问了,为什么不需要用read()函数了?不了,这里更推荐使用DictReader的用法。
原因何在?因为在Python的csv模块为我们提供了一种更好的读取方式,当csv文件中若存在映射关系,需要将字典类型的数据读取/写入csv文件时,就使用DictReader/DictWriter这两种方法。虽然read()和write()函数的用法也可以实现,但DictReader/DictWriter可以更好地反映出表头与文件内容的映射关系。
以读的方式或者使用以只写的方式打开文件,都会使用到将文件对象转换为DictReader/DictWriter对象。DictReader和read()的区别就是:前者是个类,后者是个函数(带上"小括号()"),同理,DictWriter和writer()也是一样。
DictReader/DictWriter会将字典读取/写入(映射)到csv文件的行中,会将读取或写入到的信息转换为字典形式。和read()和writer()函数是有一定区别的。
好,介绍到这里,怎么写文件对象转换为DictReader对象?代码如下所示:
employee_csv=csv.DictReader(employee_file)
因为我要先将csv对象的表头给读出来,里面用到一个fieldnames属性,其作用是设置csv文件的第一行表头数据,为了确认代码的可行性,把信息打印出来看看,代码如下所示:
headers=employee_csv.fieldnames#打印表头信息print("里面的表头信息为:{}".format(headers)
结果如下图所示:
步骤3:
有了表头信息之外,通过遍历除了表头之外的每一行数据,这里用到for循环,代码如下所示:
fordata_rowinemployee_csv:
遍历之后,我们要先获取它的文件名称+.csv后缀格式,所以这里需要用到拼接处理。“命名”为“filename”的文件来保存这些.csv文件名称,代码如下所示:
filename=data_row[名称]+.csv#拼接处理
最后要将获取到的这些数据进行拼接成新的且完整的文件路径,命名为“filepath”的文件来保存获取到的所有文件的完整路径,代码如下所示:
filepath=employees_path+filename#设置新的且完整的文件路径
为了确认可行性,打印输出信息看看:
print(filepath)#打印文件所在的完整地址
结果如下图所示:
得到了我们想要的数据。
步骤4:
到这里一步很关键,因为我们要把所有员工的csv表格文件都写入到这个新的文件中,所以要对这个文件进行以写的方式打开文件,代码如下图所示:
withopen(filepath,w,newline=)asemployees_file:#以写的方式打开文件
步骤5:
到了这一块知识点很重点,以写方式打开文件是要将文件对象转换为DictWriter对象;跟上面以读取打开文件的方式是要将文件对象转换为DictReader对象,这一点需要记住。
参考:在实例化DictWriter的时候,我们需要将一个列表传给参数fieldnames,而且必须要传入该参数,如果要问为什么,死记硬背它即可,就是需要,这是一种约定。目的是因为在设置csv文件的第一行表头数据,当我们要将字典通过DictWriter对象写入csv文件时,通常会把字典的键存入一个列表,再把这个列表传给参数fieldnames。用命名为target_files保存DictReader对象,长这样:
代码如下所示:
target_files=csv.DictWriter(employees_file,fieldnames=headers)
步骤6:
写入表头,这里使用writeheader()的方法即可实现,代码如下所示:
target_files.writeheader()#写入表头
步骤7:
到了这一步,也是最后一步,完成上司交代任务的关键点,就是写入数据这块了,将数据写入到目标文件中。写入csv表格的数据有几种方法,比如:writerow()和writerows()这两种方法。
1、writerow()方法:
先看这段代码:
importcsvmy_list=[10,11,12,13,14]withopen("C:/Users//Desktop/list.csv","w",encoding="utf-8",newline=)aslists:files=csv.writer(lists)files.writerow(my_list)
从得到的表图中看到,writerow()方法作用是将一个列表全部写入csv的同一行中。
2、writerows()方法:
先看这段代码:
importcsvmy_lists=[[10],[11],[12],[13],[14]]withopen("C:/Users//Desktop/lists.csv","w",encoding="utf-8",newline=)aslists:files=csv.writer(lists)files.writerows(my_lists)
从表图中看到,writerows()方法作用是将一个二维列表中的每一个列表写为一行(即多行显示)。从这两个方法中看,writerow()接受一维数据,writerows()接受二维数据。
所以很清楚,现在我们的数据是一维数据,只需要用writerow()方法即可,代码如下所示:
target_files.writerow(data_row)#将数据写入到目标文件中
经过以上7个步骤,终于告一段落,完成上司安排的任务了,现在一起看看这整个实现代码是如何写的?
importcsv#导入csv模块#设置保存文件路径employee_path=C:/Users//Desktop/员工职位表.csv#设置存放所有员工表的路径employees_path=C:/Users//Desktop/demo/#以读的方式打开员工职位表这个文件withopen(employee_path,r,newline=)asemployee_file:#将文件对象转换为DictReader对象employee_csv=csv.DictReader(employee_file)#将csv对象的表头给读出来,fieldnames的作用是设置csv文件的第一行表头数据headers=employee_csv.fieldnames#打印表头信息print("里面的表头为:{}".format(headers))#遍历除了表头之外的每一行数据fordata_rowinemployee_csv:filename=data_row[名称]+.csv#获取文件名filepath=employees_path+filename#获取新的文件路径print(filepath)#获取所有的csv文件路径并打印在终端上显示#以写的方式打开文件withopen(filepath,w,newline=)asemployees_file:#这一块很重点,是将文件对象转换为DictWriter对象target_files=csv.DictWriter(employees_file,fieldnames=headers)#然后写入表头中target_files.writeheader()#最后将数据写入到目标文件中target_files.writerow(data_row)
目前,这个demo是空的文件夹,什么都没有,现在,运行上面的整体代码:
发现pycharm编辑器终端上显示的信息已经全部打印出来:
再看看刚才那个demo文件有何变化?发现有csv表格文件存进去了:
总结:
上面的两个任务总体完成了,这两个要求要实现的代码除注释除外,代码量很少,仅仅几十行而已,却能让你提高工作效率,提早完成上司的要求。说不准,反而还更容易受到上司的爱戴,认为你真的可行,交代事情很靠谱,办事快。所以类似这种简单的要求,这些技巧多少还是得学会的。知识和技能是一点点长进的,追求每天都学一点,吸收-实践-温故...彼此循环。
对于学习编程语言,下面的这句话很是有道理,和大家共勉之。学到很多东西的诀窍,就是一下子不要学很多。——洛克