2017-01-05 5 views
0

У меня есть файл json с твитами, добытыми с Tweepy. Чтобы получить анализ настроений для каждого твита, я пытаюсь использовать API с сайта www.text-processing.com. Вы можете просмотреть мой настоящий (ошибочный) код ниже.Запуск команды терминала для каждой строки в файле JSON

fname = 'python.json' 
with open(fname, 'r') as f: 
    for line in f: 
     tweet = json.loads(line) 
     # Draw out the text from each tweet 
     tweet_words = tweet['text'] 
     bash_com = 'curl -d "text={}".format(tweet_words) http://text-processing.com/api/sentiment/' 
     subprocess.Popen(bash_com) 
     output = subprocess.check_output(['bash','-c', bash_com]) 
     with open('sentiment.json', 'w') as s: 
      s.write(output) 

возвращает следующую ошибку:

CalledProcessError: Command '['bash', '-c', 'curl -d "text={}".format(tweet_words) http://text-processing.com/api/sentiment/']' returned non-zero exit status 1 

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

curl -d "text=word" http://text-processing.com/api/sentiment/ 

Кто-нибудь знает о хорошем решении? Благодаря!

ответ

1

bash_com равно 'curl -d "text={}".format(tweet_words) http://text-processing.com/api/sentiment/'

Вы не вызывая format, потому что внутри строки.

Вы не должны делать это в любом случае, так как это небезопасно, вы можете использовать subprocess.check_output непосредственно:

output = subprocess.check_output(['curl', '-d', "text=" + tweet_words, 'http://text-processing.com/api/sentiment/']) 

Но вы должны использовать библиотеку HTTP, такие как запросы вместо:

requests.post('http://text-processing.com/api/sentiment/', {'text': tweet_words}) 
+0

Спасибо! Это решение работает! – Michael

Смежные вопросы