Python程序扩展与Stata集成的短网址

时间:2013-07-06 17:00:56

标签: python-2.7 stata

我有一个包含数千条推文的数据集。其中一些包含网址,但大多数都是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文件,我希望避免将它们全部附加到执行此任务中。

提前感谢您的回答!

1 个答案:

答案 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! |
     +-----------------------+

这是一个简单的例子。您案件的完整流程将是:

  1. 使用outsheet或其他命令
  2. 将文件写入带有URL的磁盘
  3. 使用!调用Python脚本
  4. 使用insheetinfile或其他命令
  5. 将输出读入Stata
  6. 通过删除capture erase my_file_on_disk.csv
  7. 的文件进行清理

    如果不清楚,请告诉我。它在* 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进行数据分析。