Как конвертировать JSON (данные Twitter) в CSV с помощью Python - PullRequest
0 голосов
/ 22 февраля 2012

Я пытаюсь запросить поисковую систему в твиттере (search.twitter.com), преобразовать результаты в json, а затем подготовить результаты в виде csv для исследовательского проекта. Я новичок в Python, но мне удалось самостоятельно кодировать 2/3 программы. Тем не менее, мне сложно конвертировать JSON-файл в формат CSV. Я попробовал различные предложенные методы без успеха. Что я тут не так делаю?

Вот что у меня есть:

import twitter, os, json, csv

qname = raw_input("Please enter the term(s) you wish to search for: ")
date = int(raw_input("Please enter today's date (no dashes or spaces): "))
nname = raw_input("Please enter a nickname for this query (no spaces): ")
q1 = raw_input("Would you like to set a custom directory? Enter Yes or No: ")

if q1 == 'No' or 'no' or 'n' or 'N':
    dirname = 'C:\Users\isaac\Desktop\TPOP'

elif q1 == 'Yes' or 'yes' or 'y' or 'Y':
    dirname = raw_input("Please enter the directory path:")

ready = raw_input("Are you ready to begin? Enter Yes or No: ")
while ready == 'Yes' or 'yes' or 'y' or 'Y':
    twitter_search = twitter.Twitter(domain = "search.Twitter.com")
search_results = []
for page in range (1,10):
    search_results.append(twitter_search.search(q=qname, rpp=1, page=page))
    ready1 = raw_input("Done! Are you ready to continue? Enter Yes or No: ")
    if ready1 == 'Yes' or 'yes' or 'y' or 'Y':
        break

ready3 = raw_input("Do you want to save output as a file? Enter Yes or No: ")
while ready3 == 'Yes' or 'yes' or 'y' or 'Y':
    os.chdir(dirname)
    filename = 'results.%s.%06d.json' %(nname,date)
    t = open (filename, 'wb+')
    s = json.dumps(search_results, sort_keys=True, indent=2)
    print >> t,s
    t.close()
    ready4 = raw_input("Done! Are you ready to continue? Enter Yes or No: ")
    if ready4 == 'Yes' or 'yes' or 'y' or 'Y':
        break

ready5 = raw_input("Do you want to save output as a csv/excel file? Enter Yes or No: ")
while ready5 == 'Yes' or 'yes' or 'y' or 'Y':
    filename2 = 'results.%s.%06d.csv' %(nname,date)
    z = json.dumps(search_results, sort_keys=True, indent=2)
    x=json.loads(z)

    json_string = z
    json_array = x

    columns = set()
    for entity in json_array:
        if entity == "created_at" or "from_user" or "from_user_id" or "from_user_name" or "geo" or "id" or "id_str" or "iso_language_code" or "text":
            columns.update(set(entity))

    writer = csv.writer(open(filename2, 'wb+'))
    writer.writerow(list(columns))
    for entity in json_array:
        row = []
        for c in columns:
            if c in entity: row.append(str(entity[c]))
            else: row.append('')

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

У вас есть несколько разных проблем.

Во-первых, синтаксис

x == 'a' or 'b' or 'c'

, вероятно, не делает то, что вы думаете, что он делает.Вместо этого вы должны использовать

x in ('a', 'b', 'c')

.

Во-вторых, ваша переменная ready5 никогда не изменяется и не будет работать прямо в цикле.Попробуйте

while True:
    ready5 = raw_input("Do you want to save output as a csv/excel file? Enter Yes or No: ") 
    if ready5 not in (...):
        break

И, наконец, что-то не так с вашим кодом дампа / загрузки.То, что вы получаете из твиттера, должно быть строкой JSON.Есть некоторый код, который вы пропустили из своего вопроса, поэтому я не могу сказать наверняка, но я не думаю, что вы вообще хотите использовать json.dumps.Вы читаете из JSON (используя json.loads) и пишете в CSV (используя csv.writer.writerow).

0 голосов
/ 19 августа 2012

После некоторых поисков, я нашел ответ здесь: http://michelleminkoff.com/2011/02/01/making-the-structured-usable-transform-json-into-a-csv/

Код должен выглядеть примерно так: (если вы ищете api в twitter python)

filename2 = '/path/to/my/file.csv'
writer = csv.writer(open(filename2, 'w'))
z = json.dumps(search_results, sort_keys=True, indent=2)
parsed_json=json.loads(z)
#X needs to be the number of page you pulled less one. So 5 pages would be 4.
while n<X:
 for tweet in parsed_json[n]['results']:
     row = []
     row.append(str(tweet['from_user'].encode('utf-8')))
     row.append(str(tweet['created_at'].encode('utf-8')))
     row.append(str(tweet['text'].encode('utf-8')))
     writer.writerow(row)
 n = n +1

Спасибо всем за помощь!

0 голосов
/ 22 февраля 2012

Другой подход заключается в том, чтобы tablib выполнил фактическое преобразование за вас:

import tablib
data = tablib.Dataset()
data.json = search_results
filename = 'results.%s.%06d.csv' %(nname,date)
csv_file = open(filename, 'wb')
csv_file.write(data.csv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...