我有一个包含数千条推文的数据集。其中一些包含网址,但大多数都是Twitter中使用的经典缩写形式。我需要能够获得完整网址的内容,以便检查某些特定网站的存在。我用Python解决了这个问题:
import urllib2
url_filename='C:\Users\Monica\Documents\Pythonfiles\urlstrial.txt'
url_filename2='C:\Users\Monica\Documents\Pythonfiles\output_file.txt'
url_file= open(url_filename, 'r')
out = open(url_filename2, 'w')
for line in url_file:
tco_url = line.strip('\n')
req = urllib2.urlopen(tco_url)
print >>out, req.url
url_file.close()
out.close()
哪个有效,但要求我将我的网址从Stata导出到.txt文件,然后重新导入完整的网址。是否有某些版本的Python脚本允许我使用shell命令将任务集成到Stata中?我有很多不同的.dta文件,我希望避免将它们全部附加到执行此任务中。
提前感谢您的回答!
答案 0 :(得分:1)
当然,这可以不离开Stata。我正在使用运行OS X的Mac。操作系统的细节可能有所不同,我猜测它是Windows。
Python和Stata方法
假设我们有以下简单的Python程序,名为hello.py
:
#!/usr/bin/env python
import csv
data = [['name', 'message'], ['Monica', 'Hello World!']]
with open('data.csv', 'w') as wsock:
wtr = csv.writer(wsock)
for i in data:
wtr.writerow(i)
wsock.close()
这个“程序”只是将一些虚假数据写入脚本工作目录中名为data.csv的文件中。现在确保脚本是可执行的:chmod 755 hello.py
。
从Stata内部,您可以执行以下操作:
! ./hello.py
* The above line called the Python program, which created a data.csv file.
insheet using data.csv, comma clear names case
list
+-----------------------+
| name message |
|-----------------------|
1. | Monica Hello World! |
+-----------------------+
这是一个简单的例子。您案件的完整流程将是:
outsheet
或其他命令!
调用Python脚本insheet
或infile
或其他命令capture erase my_file_on_disk.csv
如果不清楚,请告诉我。它在* nix上工作正常;正如我所说,Windows可能会有所不同。如果我有一个Windows盒子,我会测试它。
纯粹的Stata解决方案(一种黑客攻击)
另外,我认为你想要完成的事情可以完全在Stata中完成,但这是一个黑客攻击。这是两个程序。第一个只是打开一个日志文件并发出url请求(这是第一个参数)。第二个读取该日志文件并使用正则表达式查找Stata被重定向到的URL。
capture program drop geturl
program define geturl
* pass short url as first argument (e.g. http://bit.ly/162VWRZ)
capture erase temp_log.txt
log using temp_log.txt
copy `1' temp_web_file
end
上述程序无法完成,因为copy
命令将失败(故意)。它也不会自行清理(故意)。所以我创建了下一个程序来读取发生的事情(并获取URL重定向)。
capture program drop longurl
program define longurl, rclass
* find the url in the log file created by geturl
capture log close
loc long_url = ""
file open urlfile using temp_log.txt , read
file read urlfile line
while r(eof) == 0 {
if regexm("`line'", "server says file permanently redirected to (.+)") == 1 {
loc long_url = regexs(1)
}
file read urlfile line
}
file close urlfile
return local url "`long_url'"
end
你可以像这样使用它:
geturl http://bit.ly/162VWRZ
longurl
di "The long url is: `r(url)'"
* The long url is: http://www.ciwati.it/2013/06/10/wdays/?utm_source=twitterfeed&
* > utm_medium=twitter
你应该一个接一个地运行它们。使用此解决方案可能会变得很难看,但它确实找到了您正在寻找的URL。我可以建议另一种方法是联系缩短服务并很好地询问一些数据吗?
如果Stata的某人正在阅读此内容,那么让copy
返回HTTP响应标头信息会更好。完全在Stata中完成此操作有点儿。就个人而言,我会完全使用Python来做这类事情,并在我拥有所需的一切后使用Stata进行数据分析。