作者:刘早琪来源:早起要说工作中最头疼的事情就是处理同一个文件夹里的一堆文件方法,不难,但复杂。所以遇到机械操作的时候一定要记得用Python合理偷懒!今天我将处理微博热搜数据来说明如何使用Python批量处理文件夹中的文件,主要涉及:Python批量读取不同文件夹(???)Pandas数据处理(??)Python操作Markdown文件(?)需求分析首先,让我们解释一下需要完成的任务。以下是我们的文件夹结构。因为没有办法爬取微博历史上的热搜,所以只能自己写一个爬虫,每天爬取和保存热搜,所以我在分析数据的时候,使用了上图所示的数据.每日数据以套娃形式存放在三级目录,热搜以markdown文件形式存放。就这样打开?而我要做的是这三个月的微博热搜数据很难处理吗?手动的话,无非是点击三下进入dailydata文件夹,然后打开md文件。手动复制粘贴到Excel里,不就是几万数据,大不了一天不吃饭也能搞定!现在让我们看看如何在Python中以光速完成它。Python实现运行之前先想想如何用Python实现。其实和人工流程类似:先读取所有文件,然后每天对数据进行处理保存。所以第一步提取我们需要的所有文件路径,先导入相关库importpandasaspdimportosimportglobfrompathlibimportPath读取所有文件名的方法有很多,比如使用OS模块,但是因为我们是多层文件夹,使用OS模块只能一层层读取,写多循环效率不高,所以我们告别os.path,使用Pathlib来操作,三行代码搞定,seethecommentfrompathlibimportPathp=Path("/Users/liuhuanshuo/Desktop/hotsearchdata/")#初始化并构建Path对象FileList=list(p.glob("*/.md"))#获取全部markdown文件查看结果成功读取热搜data下多层文件夹中的所有md文件!但是新的问题来了。每天有两篇热搜汇总,一篇在11:00,一篇在23:00。考虑到数据会有重叠,我们在处理前先去重,这个也简单,不管你用正则表达式还是根据奇偶位置提取都可以。这里我使用lambda表达式,一行代码搞定。filelist=list(filter(lambdax:str(x).find("23点")>=0,FileList))现在我们每天只有23点的热搜数据。虽然是markdown文件,但是Python还是很容易上手的,我们打开其中一个来看一下。打开方法类似于其他文件使用with语句返回一个列表,但是这个列表我们不能直接使用。第一个元素包含时间,后面的每日热搜和热度不直接存储。它包含一些降价语法。用到符号和换行符,清洗这些数据是常规操作,直接使用下面的代码,主要使用正则表达式,看注释:withopen(file)asf:lines=f.readlines()lines=[i.strip()foriinlines]#去除空字符data=list(filter(None,lines))deldata[0]data=data[0:100]date=re.findall('Year(.+)2',str(file))[0]content=data[::2]#paritysplitrank=data[1::2]提取内容并为iinrange(len(content)):content[i]=re.findall(',(.+)',content[i])[0]foriinrange(len(rank)):rank[i]=re.findall('(.+)',rank[i])[0]最后只需要写一个循环遍历每天的文件并清理,然后创建一个DataFrame来存储每天的数据。可以看到,不用太复杂的代码就成功实现了我们的需求!结束语以上就是一个使用Python再次解放双手,成功偷懒的案例。在日常工作中,你可能不需要阅读Markdown文件,但希望通过这个案例,让你学会如何批量处理文件夹,批量读取和清理数据。更重要的是,在你的工作和学习中,当你遇到需要重复操作的任务时,你能不能想到用Python来自动化解决!拜拜,下次case见~
