在Python中将多个JSON写入CSV-字典写入CSV

在Python中将多个JSON写入CSV-字典写入CSV,python,csv,dictionary,tweepy,Python,Csv,Dictionary,Tweepy,我正在使用Tweepy来流式传输推文,并希望以CSV格式记录它们,以便我可以播放它们或稍后将它们加载到数据库中。 请记住,我是一个noob,但我确实意识到有多种处理方法(建议是非常受欢迎的) 长话短说,我需要将多个Python字典转换并附加到CSV文件中。 我已经做了我的研究()并尝试用DictWriter和writer方法来做这件事 然而,还有几件事需要完成: 1) 只将键作为头写入一次 2) 当新tweet流式传输时,需要在不覆盖前几行的情况下追加值 3) 如果值丢失,则记录为NULL 4)

我正在使用Tweepy来流式传输推文,并希望以CSV格式记录它们,以便我可以播放它们或稍后将它们加载到数据库中。 请记住,我是一个noob,但我确实意识到有多种处理方法(建议是非常受欢迎的)

长话短说,我需要将多个Python字典转换并附加到CSV文件中。 我已经做了我的研究()并尝试用DictWriter和writer方法来做这件事

然而,还有几件事需要完成:

1) 只将键作为头写入一次

2) 当新tweet流式传输时,需要在不覆盖前几行的情况下追加值

3) 如果值丢失,则记录为NULL

4) 跳过/修复ascii编解码器错误

下面是我希望得到的格式(每个值都在其单独的单元格中):

校长1\u键\u 1校长2\u键\u 2校长3\u键\u 3

第1行\u值\u 1第1行\u值\u 2第1行\u值\u 3

第2行\u值\u 1第2行\u值\u 2第2行\u值\u 3

第3行\u值\u 1第3行\u值\u 2第3行\u值\u 3

第4行数值第1行数值第2行数值第4行数值第3

这是我的密码:

from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
import csv
import json

consumer_key="XXXX"
consumer_secret="XXXX"
access_token="XXXX"
access_token_secret="XXXX"

class StdOutListener(StreamListener):

    def on_data(self, data):
        json_data = json.loads(data)

        data_header = json_data.keys()
        data_row = json_data.values()

        try:
            with open('csv_tweet3.csv', 'wb') as f:
                w = csv.DictWriter(f, data_header)
                w.writeheader(data_header)
                w.writerow(json_data)
        except BaseException, e:
            print 'Something is wrong', str(e)

        return True

    def on_error(self, status):
        print status

if __name__ == '__main__':
    l = StdOutListener()
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    stream = Stream(auth, l)
    stream.filter(track=['world cup'])

提前谢谢你

我用facebook的graph API(模块)做了类似的事情

从tweepy.streaming导入StreamListener
从tweepy导入OAuthHandler
从tweepy导入流
导入csv
导入json
消费者_key=“XXXX”
消费者_secret=“XXXX”
访问令牌=“XXXX”
访问\u令牌\u secret=“XXXX”
类StdOutListener(StreamListener):
_标题=无
定义初始化(self,header,*args,**键):
StreamListener.\uuuu初始化(self,*args,**键)
self.\u头=头
def on_数据(自身、数据):
json_data=json.loads(数据)
#data\u header=json\u data.keys()
#data\u row=json\u data.values()
尝试:
用open('csv_tweet3.csv','ab')作为f:#a作为append
w=csv.writer(f)
#写!
w、 writerow(self.\u valToStr(json\u数据[头])
如果json_数据中的标头为else“”
用于自身中的标题。\u标题)
除例外情况外,e:
打印“有问题”,str(e)
返回真值
@静态法
def_valToStr(o):
#json返回一组数据类型-根据需要进行解析
# https://docs.python.org/2/library/json.html#encoders-和解码器
如果类型(o)=unicode:返回self.\u removeNonASCII(o)
elif类型(o)=bool:返回str(o)
elif类型(o)=无:返回“”
埃利夫。。。
...
def_removeNonASCII(s):

返回“”。加入(如果ord(i)你是说你所拥有的东西不起作用吗?另外,你总是可以将json转储到一个文件中,每行一个条目……它不起作用。是的,你可以,但我正在尝试使用csv格式。当你说它“不起作用”时,是否有任何特定的东西似乎不起作用。例如,是否有例外?这对我来说似乎是一种暴力方法是这样的,但为什么不自己记录行呢?例如:
headers=[]
values=[]
对于键,json.iteritems()中的值:
`headers.append(key)`values.append(values)``
csv.writerow(headers)
csv.writerow(values)
,看起来很棒。完全同意。
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
import csv
import json

consumer_key="XXXX"
consumer_secret="XXXX"
access_token="XXXX"
access_token_secret="XXXX"

class StdOutListener(StreamListener):
    _headers = None
    def __init__(self,headers,*args,**keys):
        StreamListener.__init__(self,*args,**keys)
        self._headers = headers

    def on_data(self, data):
        json_data = json.loads(data)

        #data_header = json_data.keys()
        #data_row = json_data.values()

        try:
            with open('csv_tweet3.csv', 'ab') as f: # a for append
                w = csv.writer(f)
                # write!
                w.writerow(self._valToStr(json_data[header])
                           if header in json_data else ''
                           for header in self._headers)
        except Exception, e:
            print 'Something is wrong', str(e)

        return True

    @static_method
    def _valToStr(o):
        # json returns a set number of datatypes - parse dependingly
        # https://docs.python.org/2/library/json.html#encoders-and-decoders
        if type(o)==unicode: return self._removeNonASCII(o)
        elif type(o)==bool: return str(o)
        elif type(o)==None: return ''
        elif ...
        ...

    def _removeNonASCII(s):
        return ''.join(i if ord(i)<128 else '' for i in s)

    def on_error(self, status):
        print status

if __name__ == '__main__':
    headers = ['look','at','twitter','api',
               'to','find','all','possible',
               'keys']

    # initialize csv file with header info
    with open('csv_tweet3.csv', 'wb') as f:
        w = csv.writer(headers)

    l = StdOutListener(headers)
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    stream = Stream(auth, l)
    stream.filter(track=['world cup'])