2

私は(ため息をついて)最終的に機能するスクリプトを完成させました。ツイッターでキーワード検索。結果は、キーワード、Tweet、Lat、Lon (場所) の 4 つの列を含む csv に書き込まれます。私が使用しているコードは次のとおりです。

import tweepy
import csv

keywordList = ['McDonalds', 'Taco Bell', 'Burger King',]
for keyword in keywordList:
    result = tweepy.api.search(q=keyword,rpp=1000,page=2, geocode= "34.085422,-117.900879,500mi" )

    with open(r'C:\Temp\results.csv', 'a') as acsv:
        w = csv.writer(acsv)
        for tweet in result:
            lat, lon = tweet.geo if tweet.geo else ('', '')
            try:
                a = tweet.geo['coordinates']
                print a[0] , a[1]
                print tweet.text
                w.writerow((keyword, tweet.text, a[0] , a[1]))
            except:
                pass

タスク マネージャーまたは python を使用してこの検索を 5 分ごとに実行したいのですが、重複を書き換えます。次のコードを使用して重複を削除しようとしましたが、2 つのことが起こります。resutls2.csv は空白で、csv を開こうとするとロックされており、読み取り専用で表示する必要があります。f1.close()、writer.close() などを試しましたが、「csv.reader」オブジェクトには属性 close がないと表示されます。

私の最大の懸念は、新しいcsvに書き込むか、検索のたびに同じテーブルを削除して書き込むことによって、重複が得られないことです。どんな提案でも大歓迎です!!

import csv

f1 = csv.reader(open(r'C:\Temp\results.csv', 'rb'))
writer = csv.writer(open(r'C:\Temp\results2.csv', 'wb'))
tweet = set()
for row in f1:
    if row[1] not in tweet:
        writer.writerow(row)
        tweet.add( row[1] )
f1.close()
writer.close()
4

1 に答える 1

0

リファクタリングされたバージョンは次のとおりです。

編集:ユニコード、なんて楽しい - read_csv() に .decode() 呼び出しを追加し、append_csv(); に .encode() 呼び出しを追加しました。これで問題が解決するはずです(文字列コーデックを決定する必要があるかもしれません)。

import tweepy
import csv
from collections import defaultdict
import time

FILE = 'c:/temp/results.csv'
KEYWORDS = ['McDonalds', 'Taco Bell', 'Burger King']
WHERE = "34.085422,-117.900879,500mi"
DELAY = 300  # seconds

def _float(s, err=None):
    try:
        return float(s)
    except ValueError:
        return err

def _str(f, err=""):
    return err if f is None else str(f)

def read_csv(fname=FILE):
    data = defaultdict(dict)
    with open(fname, 'rb') as inf:
        incsv = csv.reader(inf)
        for kw,tw,lat,lon in incsv:
            # added .decode() call to handle saved unicode chars
            data[kw][tw.decode()] = (_float(lat), _float(lon))
    return data

def append_csv(data, fname=FILE):
    with open(fname, "ab") as outf:
        outcsv = csv.writer(outf)
        # added .encode() call to handle saved unicode chars
        outcsv.writerows((kw,tw.encode(),_str(lat),_str(lon)) for kw,dat in data.iteritems() for tw,(lat,lon) in dat.iteritems())

def search_twitter(keywords=KEYWORDS, loc=WHERE):
    data = defaultdict(dict)
    for kw in keywords:
        for tweet in tweepy.api.search(q=kw, rpp=1000, page=2, geocode=loc):
            data[kw][tweet.text] = tweet.geo if tweet.geo else (None,None)
    return data

def calc_update(old_data, new_data):
    diff = defaultdict(dict)
    for kw,dat in new_data.iteritems():
        for tw,loc in dat.iteritems():
            if tw not in old_data[kw]:
                diff[kw][tw] = old_data[kw][tw] = loc
    return old_data, diff

def show_data(data):
    for kw,dat in data.iteritems():
        for tw,(lat,lon) in dat.iteritems():
            print("<{},{}> {} [{}]".format(_str(lat,"???"), _str(lon,"???"), tw, kw))

def main():
    data = read_csv()
    while True:
        new_data  = search_twitter()
        data,diff = calc_update(data, new_data)
        append_csv(diff)
        show_data(diff)
        time.sleep(DELAY)

if __name__=="__main__":
    main()
于 2012-06-06T03:34:20.893 に答える