Программа Python для расширения коротких URL-адресов, которая интегрируется с Stata

У меня есть набор данных, содержащий тысячи твитов. Некоторые из них содержат URL-адреса, но большинство из них в классических сокращенных формах, используемых в Twitter. Мне нужно что-то, что получает полные URL-адреса, чтобы я мог проверить наличие некоторых конкретных сайтов. Я решил проблему в 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()

Что работает, но требует, чтобы я экспортировал свои URL-адреса из Stata в файл.txt, а затем повторно импортировал полные URL-адреса. Есть ли какая-нибудь версия моего скрипта Python, которая позволила бы мне интегрировать задачу в Stata с помощью команды shell? У меня довольно много разных файлов.dta, и в идеале я бы хотел не добавлять их все только для выполнения этой задачи.

Заранее спасибо за любой ответ!

1 ответ

Конечно, это возможно, не покидая Stata. Я использую Mac под управлением OS X. Детали вашей операционной системы могут отличаться, я полагаю, это 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. Записать файл на диск с URL, используя outsheet или какая-то другая команда
  2. использование ! вызвать скрипт Python
  3. Прочитайте вывод в Stata, используя insheet или же infile или какая-то другая команда
  4. Очистите, удалив файлы с capture erase my_file_on_disk.csv

Дайте мне знать, если это не ясно. Он отлично работает на *nix; как я уже сказал, Windows может быть немного другой. Если бы у меня была коробка с Windows, я бы ее протестировал.

Pure Stata Solution (отчасти взломать)

Кроме того, я думаю, что то, чего вы хотите достичь, может быть полностью выполнено в Stata, но это взлом. Вот две программы. Первый просто открывает файл журнала и делает запрос на URL (который является первым аргументом). Второй читает этот файл журнала и использует регулярные выражения, чтобы найти URL, на который был перенаправлен Stata.

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 для анализа данных, как только у меня было все, что мне нужно.

Другие вопросы по тегам