0

我有一个包含数千条推文的数据集。其中一些包含 url,但其中大多数是 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 文件,理想情况下,我希望避免为了执行此任务而将它们全部附加。

提前感谢您的任何回答!

4

1 回答 1

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使用 URL或其他命令将文件写入磁盘
  2. 用于!调用 Python 脚本
  3. insheet使用orinfile或其他命令将输出读入 Stata
  4. 通过删除文件进行清理capture erase my_file_on_disk.csv

如果不清楚,请告诉我。它在 *nix 上运行良好;正如我所说,Windows 可能会有所不同。如果我有一个 Windows 盒子,我会测试它。

纯 Stata 解决方案(有点像 hack)

另外,我认为您想要完成的事情可以完全在 Stata 中完成,但这是一个 hack。这里有两个程序。第一个只是打开一个日志文件并请求 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。我可以建议另一种方法是联系缩短服务并很好地询问一些数据吗?

copy如果 Stata 的某个人正在阅读此内容,那么返回 HTTP 响应标头信息会很好。完全在 Stata 中执行此操作有点过时。就我个人而言,我会完全使用 Python 来处理这类事情,并在拥有所需的一切后使用 Stata 来分析数据。

于 2013-07-06T19:45:54.923 回答