2016-04-17 12 views
1

特定のユーザーから新しいツイートをダウンロードし、いくつかの他のルールでフィルタしたいと思います。 NRE_tweetファイルに保存しているものを複製するのを避けるためにtweetid.txtファイルにあるIDで処理しているツイートのツイートIDを参照するにはどうすればいいですか?IDがtxtファイルに含まれているかどうかを確認してください

これは、私が今までに重複を作成しているものです。

i = 0 
for tweet in NRE_tweets: 

    tweet_ids = open('tweetid.txt', 'a+') 

    if NRE_tweets[i]['in_reply_to_screen_name'] is None: 

     if NRE_tweets[i]['id_str'] not in tweet_ids.readlines(): 
      print("adding tweet " + str(NRE_tweets[i]['id_str'])) 
      info_wanted.append(NRE_tweets[i]['text']) 
      info_wanted.append(NRE_tweets[i]['id_str']) 
      info_wanted.append(NRE_tweets[i]['created_at']) 

      NRE_file = open('NRE.txt', 'a') 
      NRE_file.write(str(info_wanted) + '\n') 
      NRE_file.close() 

      append_tweet_ids = open('tweetid.txt', 'a') 
      append_tweet_ids.write(NRE_tweets[i]['id_str'] + '\n') 
      append_tweet_ids.close() 

    tweet_ids.close() 
    info_wanted = [] 

    i += 1 

編集:ありがとうございます、作業コードがソートされました。それをよりきれいにするために私ができることはいくつかありますが、今のところ...それは機能します。 xは文字通りNoneである可能性がありますしない限り、

NRE_tweets = t.statuses.user_timeline(screen_name='NRE_northern') 
i = 0 

NRE_file = open('NRE.txt', 'a') 
openFile = shelve.open('tweetid') 

try: 
    loadIDs = openFile['list_id'] 
    print("list_id's loaded") 
except: 
    print("exception entered") 
    loadIDs = [] 

for tweet in NRE_tweets: 
    if NRE_tweets[i]['in_reply_to_screen_name'] is None: # check that tweet isn't a reply 
     if NRE_tweets[i]['id_str'] in loadIDs: 
      print(str(NRE_tweets[i]['id_str']) + ' already stored') 

     else: 
      print("adding " + str(NRE_tweets[i]['id_str'])) 
      # added wanted elements to a list 
      info_wanted.append(NRE_tweets[i]['text']) 
      info_wanted.append(NRE_tweets[i]['id_str']) 
      info_wanted.append(NRE_tweets[i]['created_at']) 

      # added list to txt file 
      NRE_file.write(str(info_wanted) + '\n') 

      loadIDs.append(NRE_tweets[i]['id_str']) 
      openFile['list_id'] = loadIDs 

    info_wanted = [] 

    i += 1 

print(openFile['list_id']) 
NRE_file.close() 
openFile.close() 
+3

ファイルからデータをロードする必要がないようにするために、ループの外側でファイルを開いたままにしないでください。私はファイルがおそらく使用する構造が間違っていると思うかもしれませんが、少なくともdictやsqlite dbのようなものをダンプすることをお勧めします。 –

答えて

3

は、あなたのコード内でif x is None:を使用しないでください。 None is Noneと他のすべての人(0、空のiterablesなど)は偽造者であるため、代わりにif not xを使用してください。

readlines()は、ファイル内の行を返します。各行には、\nの行が含まれます。だから、あなたがコメントに助言してきたように、if (NRE_tweets[i]['id_str'] + '\n') not in tweet_ids.readlines():

を書くforループ後にループのと近い一度ファイルを開く必要があります。また、これにはshelveモジュール(またはsqlite3)を使用することを検討してください。データの扱いがより簡単になります。

EDIT:

また、私はあなたが間に閉じることなく二回tweetid.txtを開け気づきます。 IFブロック内の2番目のopen()は必要ありません。新しいIDをファイルに追加するには、最初のファイルハンドルを使用してwrite()に電話するだけです。ループの外側にあるreadlines()も呼び出して、forループヘッダーで使用するリストに保存する必要があります。これは、新しいコード構造では、ファイルが使い果たされた後にreadlines()を呼び出すと空の文字列が返されるためです。新しいIDを見つけたら、このリストに追加するだけでなく、write()に電話してにIDを追加します。

代わりに、最初にファイルを読み取りモードで開き、readlines()と呼び出して、結果をリストに保存してファイルを閉じます。ループを開始し、リスト上のすべての操作を実行します。新しいIDを追加し、削除してください。ループの最後に、tweetid.txtを書き込みモードで開き、リストの内容をファイルに書き込みます。古い内容を上書きします。多くの新しいIDを追加できる場合は、この方法を使用します。

ファイルを一度しか開いて操作しないように、コードを構造化し、最後に閉じます。

+0

ツイッターからデータがダウンロードされるときに、 : 'In_reply_to_screen_name'は返信先の文字列を返します。投稿が返信でない場合はNone値です。私はこれらのつぶやきだけがNone値で欲しいです。 私は棚を含むコードを書き直しました。自分の家のPCにモジュールを手に入れることができないので、私は家のPCに着くまでそれをテストすることはできません。しかし、私はIDLEでいくつかのテストを行った。コンセプトはうまくいくようです。ありがとう! – Levo

+0

@Levoあなたは歓迎です:)私は私の答えを編集しました – TisteAndii

+0

いくつかのおかげで助けてください。私が何を目指しているのかにいくらかの方法。しかし、私は少なくとも私が望むデータを取得する作業コードを持っています。 作業コードを追加するように編集しました。 – Levo

関連する問題