2013-12-11 63 views
1

我是python和編程的新手,一直試圖通過這個項目來教自己。當識別出一個字符串時打印一個單詞

下面的代碼運行時出錯,但它會創建一個空的.csv。

我想我可以使用words = text.split(),但我不能用發生器做到這一點。

這是我得到的數據樣本:

Wed Dec 11 22:51:56 +0000 2013,@KBIJR please contact me via email: [email protected]!,1260080780 

我只是想從我的.csv的「文本」字符串打印的電子郵件地址。

import csv 
import json 
import oauth2 as oauth 
import urllib 
import sys 
import requests 
import time 

CONSUMER_KEY = "" 
CONSUMER_SECRET = "" 
ACCESS_KEY = "" 
ACCESS_SECRET = "" 

class TwitterSearch: 
    def __init__(self, 
     ckey = CONSUMER_KEY, 
     csecret = CONSUMER_SECRET, 
     akey = ACCESS_KEY, 
     asecret = ACCESS_SECRET, 
     query = 'https://api.twitter.com/1.1/search/tweets.{mode}?{query}' 
    ): 
     consumer  = oauth.Consumer(key=ckey, secret=csecret) 
     access_token = oauth.Token(key=akey, secret=asecret) 
     self.client = oauth.Client(consumer, access_token) 
     self.query = query 

    def search(self, q, mode='json', **queryargs): 
     queryargs['q'] = q 
     query = urllib.urlencode(queryargs) 
     return self.client.request(self.query.format(query=query, mode=mode)) 

def write_csv(fname, rows, header=None, append=False, **kwargs): 
    filemode = 'ab' if append else 'wb' 
    with open(fname, filemode) as outf: 
     out_csv = csv.writer(outf, **kwargs) 
     if header: 
      out_csv.writerow(header) 
     out_csv.writerows(rows) 

def main(): 
    ts = TwitterSearch() 
    response, data = ts.search('@gmail.com', result_type='recent') 
    js = json.loads(data) 

    messages = ([msg['created_at'], msg['text'], msg['user']['id']] for msg in js.get('statuses', [])) 

    search_terms = ['@gmail.com'] 
    text = messages 
    matches = [] 
    for term in search_terms: 
     match = [word for word in text if term in word] 
     matches.append(match) 
     write_csv('twitter_gmail.csv', messages, append=True) 

if __name__ == '__main__': 
    main() 
+0

你確定你的字符串文字是正確的? – kviiri

+0

首先,你不會對匹配變量做任何事 – placeybordeaux

+0

這個邏輯肯定是令人困惑的,對於搜索術語中的每一個術語,你都會用相同的消息更新CSV,所以CSV有消息的多個副本,但沒有辦法區分爲什麼每行都存在?您也不檢查ts.search()是否工作,並且js實際上包含json數據。text是消息,它是一個永遠不會匹配的列表的列表search_terms。 –

回答

0

如果你想要做的就是從文本字符串提取電子郵件:

import re 

s = "Wed Dec 11 22:51:56 +0000 2013,@KBIJR please contact me via email: [email protected]!,1260080780" 

match_emails = re.compile((
    "([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`" 
    "{|}~-]+)*(@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(\.|" 
    "\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)") 
) 

emails = match_emails.findall(s) 
for email in emails: 
    print email[0] 

輸出:

[email protected] 
+0

你能想象如果這個正則表達式有一個錯誤會發生什麼? –

+1

世界將炸燬:) –

+0

這樣做的工作,但我最終傾倒數據到Mysql和使用子字符串查詢來提取出來,因爲我無論如何需要在表中的數據..謝謝!愛這個網站 – user2748540