2016-09-02 5 views
0

私は比較的新しいpythonで、ツイートをダウンロードして別のテキストファイルに保存しようとしています。私はファイル名を動的にしたいので、私の要求に従ってコードを修正しようとしました。以下は、私が修正しようとしているコードは次のとおりです。 -Pythonを使って別のファイルにつぶやきを保存する

class StdOutListener(StreamListener): 
def on_data(self, data): 
    i=1 
    try: 
     if os.path.isfile('filename'+str(i)+'.txt'): 
      if os.stat('filename'+str(i)+'.txt').st_size > 5000000: 
       i=i+1 
    #   print data 
       savefile=open('filename'+str(i)+'.txt','a') 
       savefile.write(data) 
       savefile.write('\n') 
       savefile.close() 
       return True 
      else: 
       savefile=open('filename'+str(i)+'.txt','a') 
       savefile.write(data) 
       savefile.write('\n') 
       savefile.close() 
       return True 
     else: 
      savefile=open('filename'+str(i)+'.txt','a') 
      savefile.write(data) 
      savefile.write('\n') 
      savefile.close()     
    except BaseException, e: 
     print 'failed_ondata,',str(e) 
     time.sleep(5)    
def on_error(self, status): 
    print status 

何かが、動作するようには思えないよう上記のコードではオフになっています。私はまだ学んでいますし、最も明白なことかもしれませんが、誰かが上記のコードを手助けできるかどうか本当に感謝します。

答えて

0

ファイルが存在するたびにiをインクリメントするループがありません。このメカニズムはインデックス1のファイルでのみ動作し、インデックス2のファイルを作成してそこで停止します。

修正: "フリー"ファイル名が見つかるとすぐに中断するループを追加しました。ファイルサイズとコードを取得するためのより良い方法を確認することははるかにコンパクトです。テストされ、設計どおりに動作します:サイズが大きすぎるたびにファイルを作成します。

import os 

class StdOutListener(StreamListener): 
    def get_filename(self,i): 
     return 'filename'+str(i)+'.txt' 

    def on_data(self, data): 
     i=1 
     try: 
      # compute first free file 
      while True: 
       f = self.get_filename(i) 
       if os.path.isfile(f): 
        if os.path.getsize(f) > 5000000: 
         i+=1 # next file index 
        else: 
         break # file exists but size small enough 
       else: 
        break # ok file does not exist 
      savefile=open(self.get_filename(i),'a') 
      savefile.write(data) 
      savefile.write('\n') 
      savefile.close() 
      return True # done! 
     except BaseException as e: 
      print('failed_ondata,',str(e)) 
      time.sleep(5) 
      return False 

    def on_error(self, status): 
     print(status) 
+0

どうもありがとう:

は、ここに私の提案です!これは完璧に動作します。 –

関連する問題