如何使用Python将JSON(Twitter数据)转换为CSV

如何使用Python将JSON(Twitter数据)转换为CSV,python,json,twitter,csv,Python,Json,Twitter,Csv,我试图查询twitter搜索引擎(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 sea

我试图查询twitter搜索引擎(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('')

你有几个不同的问题

首先,语法

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

最后,您的卸载/装载代码有问题。你从twitter上得到的应该是一个JSON字符串。您的问题中遗漏了一些代码,因此我无法确定,但我认为您根本不想使用json.dumps。您正在读取JSON(使用
JSON.loads
)并写入CSV(使用
CSV.writer.writerow
)。

另一种方法是为您进行实际转换:

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)

在四处搜索之后,我在这里找到了答案:

代码应该如下所示:(如果您正在搜索twitter python api)

filename2='/path/to/my/file.csv'
writer=csv.writer(打开(filename2,'w'))
z=json.dumps(搜索结果,排序键=True,缩进=2)
parsed_json=json.loads(z)
#X需要是您拉取的页面数减去1。所以5页等于4页。

而nAnd您看到的问题是什么?“将结果转换为json,然后将结果准备为csv”这到底应该如何工作?您希望输出是什么样的?“key1:value1,key2:value2,…”或“key1,key2,key3…\n value1,value2,value3,…”(类似于用换行符与值分隔的列标题)我希望有一个csv,其中tweet信息作为列(即日期,用户ID,等码,文本),每个新tweet都代表一行。我已经看到了许多将json转换为csv的例子:我再次为您修复了代码缩进(我认为,尽管它变得越来越复杂,也越来越难猜测您想要的缩进)。缩进对于python来说非常重要,如果您需要SO社区的帮助,最好的办法是为我们提供实际运行的代码、您期望它做什么以及您看到它做什么。要保持代码格式正确,您应该直接将其键入.py文件并确保其运行,然后直接复制并粘贴到此处,高亮显示它,然后单击“代码”按钮(大括号)。谢谢大家的评论!我将尝试对代码进行这些更改。实际上,我把剩下的代码放在上面让你通读。我在web上看到的大多数示例都建议使用读json/写csv组合的一些变体。我希望有一个csv文档,包含推特搜索的所有基本信息(即用户ID、大地水准面、iso代码、文本等)。如果我只是做一个普通转储,格式似乎都搞糟了。对不起!我不知道该怎么做。现在进行了更改。此操作是否处理嵌套数据?看起来是否,它以静默方式写入垃圾(提交了一个bug:)。但是你可以通过在第一个维度上迭代并编写多个“数据库”来调整它以处理3个维度。有一个更好的解决方案(我记不起引用)利用一些递归。以下是我更新帖子的链接:
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