查看原文
其他

fileexists:告诉你“我”存在吗?

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:石   艳,中南财经政法大学统计与数学学院

本文编辑:崔赵雯

技术总编:余术玲 

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元

1.导读

当有一天,你突然想找一个确定文件名的文件,却又不确定文件是否在记忆中的文件夹中,这个时候怎么办呢?你可能会打开文件夹,然后开始“漫漫”寻找,如果找到自然最好,找不到难免“空欢喜”一场。今天我们来介绍的命令就可以帮助我们快速确定文件是否存在,一起来看看吧~

2.命令语法

fileexists是一个程序函数,用法比较简单,直接在其后面加上文件名即可。即fileexists("f"),f 就是要确定文件的名称,如果文件在相应目录下存在(即使不能打开),返回结果为1;不存在或为文件夹,返回结果为0.

3.实例分析

首先看一个简单的例子,此处为了演示效果,我们新建一个文件夹,事先只放入一个名为temp.txt的文件,来观察使用fileexists的结果。
clear allcap mkdir d:/fileexistscd d:/fileexistsset obs 1gen v1=fileexists("temp.txt")gen v2=fileexists("title_1.dta")list v1 v2

其结果如上所示,可以看到和事实一样。而且在此提醒大家注意,文件名一定要包含扩展名,否则会出错。
fileexists的另一个“用武之地”是在爬虫中。因为网速等原因可能会导致网页的源文件下载不下来,那么我们的程序就不能对源文件进行接下来的处理,这就会导致程序报错,既然我们有了判断文件是否存在的函数,我们就可以在进行下一步的处理之前先看一下源文件是否存在。我们以https://www.boc.cn/的所有公告页面为例,爬取每一页具体公告名称,链接和日期。

首先观察单个网页的源代码,发现我们要找的信息三个为一组,所以我们先把包含所需信息的几行合并为一行(采用某种标志),其次保留这些行,再进行相应信息的提取即可。值得注意的是在提取链接时出现了两种不同的情况(见下图)所以用正则表达式进行了分类处理,过程看起来有点麻烦。

所有页面的程序如下:
clear allcap mkdir d:/fileexistscd d:/fileexistsforvalues j=1/37{ cap copy "https://www.boc.cn/custserv/bi2/index_`j'.html" temp`j'.txt,replace while fileexists("temp`j'.txt") == 0 { sleep 5000 cap copy "https://www.boc.cn/custserv/bi2/index_`j'.html" temp`j'.txt,replace } infix strL v 1-10000 using "temp`j'.txt",clear //观察后不用进行转码,可直接进行下一步 forvalues i=`=_N'(-1)2{ if index(v[`i'],"</li>") & !index(v[`i'],"</a>") { replace v=v+v[`i'] in `=`i'-1' drop in `i' } } //按某种标志进行合并 keep if index(v,"</span></li>") gen url=ustrregexs(1) if ustrregexm(v,`"<a href="(.*?)""') forvalues k=1/`=_N' { if ustrregexm(url[`k'],"^../../"){ replace url= "https://www.boc.cn"+substr(url,6,.) in `k' } if ustrregexm(url[`k'],"^./"){ replace url= "https://www.boc.cn/custserv/bi2/"+substr(url,3,.) in `k' } } //两种不同的链接,分类进行处理。 gen title=ustrregexs(1) if ustrregexm(v,`"title="(.*?)""') gen date=ustrregexs(1) if ustrregexm(v,"<span>(.*?)</span>") replace date=substr(date,3,11) drop v save title_`j',replace}
clear forvalues i=1/37{ append using title_`i'}sort datesave title_total,replace
在上述程序中,我们就可以发现fileexists的作用了。在尝试获取源文件后,我们立刻用fileexists进行了判断,如果返回为0,说明源文件未获得,则休息一下,直到源文件成功获得;如果返回为1,说明源文件已经获得然后就继续进一步的处理。这就可以帮助我们节省一定时间啦。
最后我们将所有页面的数据进行合并,部分结果如下:

(ps:公告页面的链接规律是从第二页开始的,所以只保留了第二页到最后一页)
以上就是对fileexists的简单介绍了,欲知详细如何,且待各位看官自行探索!




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

工作中一切困难的解决途径——motivatedolly

【爬虫实战】喜茶的门店都开在了哪里?

import delimited | 再也不用担心读入网页源代码“乱七芭蕉”了

如何简洁地列出指定属性的变量?ds命令来了!

如何在Python中进行描述性统计分析?

分析师和他们的雇主重视与管理层接触吗?——分析师参与盈余电话会议的研究

繁忙的董事与公司业绩:来自并购的证据
使用Python接口读取CSMAR数据
列表生成式|让你的代码简洁又美观
Stata中变量观测值的亲密伙伴——levelsof命令

爬虫俱乐部开发的命令更新及常见问题说明

Seminar | 道德培训真的有用吗?

网络爬虫入门之requests 库的基本使用——以亚马逊图书界面为例
reduce()函数和filter()函数闪亮登场
“环环”入扣之foreach命令

统计年鉴数据整理小技巧

Seminar | 作为飞行员,我比别的CEO多了什么?

利用TensorFlow构建前馈神经网络

推文合集(1)| Stata学习者必看的n篇推文!

Seminar | 诚信的价值

利用tushare获取股票数据及实现可视化

关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存