2016-11-03 11 views
0

私はプログラミングが初めてで、過去24時間以内に作成または変更されたフォルダからファイルを検出するためにPythonを使用してスクリプトを作成しなければならない課題に取り組んでいますそれらのファイルを別のディレクトリに移動します。Pythonで時間範囲固有のファイルを移動する

ファイルの作成日と変更日を印刷するコードを書きました. には、24時間以上前に変更された古いファイルもソートされる関数があります。しかし、私は実際にそれらの特定のファイルを取得し、それらを新しいフォルダに転送するスクリプトを作成することに苦労しています。これは私のコードの最初の部分である:

import os,time 
    import datetime 
    import shutil 


    now = dt.datetime.now() 
    ago = now-dt.timedelta(hours=24) 
    strftime = "%H:%M %m/%d/%Y" 
    created = 'C:\\Users\\Jacquelin\e\Desktop\\created' 
    dest = 'C:\\Users\\Jacqueline\\Desktop\\dest' 


    for root, dirs,files in os.walk(created): 
     for fname in files: 
      path = os.path.join(root, fname) 
      st = os.stat(path)  
      mtime = dt.datetime.fromtimestamp(st.st_mtime) 
      if mtime > ago: 
       print "True: ", fname, " at ", mtime.strftime("%H:%M %m/%d/%Y") 
      else: 
       print False 

    for fname in os.listdir(created): 
     if mtime > ago:     
      shutil.move(path, dest) 
      print "moved to dest", fname 

私はファイルを転送するshutil.moveを使用していて、万人things--を試してみましたが、それを把握することはできません!私は、これらを関数を単純化するために使うことにも取り組んでいます。これまでのところ、これは私が持っているものです。

「移動」機能については
def find_info():         #this first func. works fine. 
     for root, dirs, files in os.walk(created): 
     for fname in files: 
      path = os.path.join(root, fname)           
      st = os.stat(path)  
      mtime = dt.datetime.fromtimestamp(st.st_mtime)       
     if mtime > ago: 
      print True 
     else: 
      print False 

、私は、これは正しい考えであるように感じますが、渡す変数を知らない、私は空の括弧を残してきました。そしては、がブーリアンの狂った長いリストを返します。そう。

def move(): 
     for fname in os.listdir(created): 
      path = os.path.join(root, fname) 
      if find_info(fname) == True:     
       shutil.move(path, dest) 
       print "moved to dest", fname 

    print find_info()       #variable? is one even needed? 
    print move()        #variable???? 

    print os.listdir(dest) 
    print os.listdir(created) 

私はどの変数を関数に渡すべきかわかりません。その後、ファイルが実際に転送されたかどうかを確認するためにディレクトリを印刷しています。悪いことは動かないでしょう。

ありがとうございます!

+0

あなたは 'shutil.move'をどのように使っているのか、何がうまくいかないのか説明できますか?エラーメッセージなど?また、バックスラッシュは '\ n 'のように特別な意味を持っているので、' 'c:\\ Users \\ ...」'または '(os)を使用してエスケープする必要があるので、 .path.join'。 –

+0

私は自分のコードを変更しました。元のメッセージの上に置きます。 shutil.moveを使用すると、ファイルを移動しないだけです!私はプログラムが元と目的地のディレクトリを印刷しているが、転送は行われていない。 – nikkiy

答えて

0

あなたはほとんどここにいます。特定のファイルが移動可能であることを検出した後(print("True: ", fname, " at ", mtime.strftime("%H:%M %m/%d/%Y"))の前/後)に、shutil.move関数を呼び出してください。このような何かが動作します:

import os,time 
import datetime 
import shutil 

import datetime as dt 

now = dt.datetime.now() 
ago = now-dt.timedelta(hours=24) 
strftime = "%H:%M %m/%d/%Y" 
created = 'here' 
dest = 'there' 

for root, dirs,files in os.walk(created): 
    for fname in files: 
     path = os.path.join(root, fname) 
     st = os.stat(path)  
     mtime = dt.datetime.fromtimestamp(st.st_mtime) 
     if mtime > ago: 
      print("True: ", fname, " at ", mtime.strftime("%H:%M %m/%d/%Y")) 
      shutil.move(path, dest) 
      # this is actual move 

次のスニペットは、必要なすべて間違ってはないです:それは明らかではないので、ここで

for fname in os.listdir(created): 
    if mtime > ago:     
     shutil.move(path, dest) 
     print "moved to dest", fname 

mtimepathdestは、ループ変数fnameに依存しませんなぜここにループが必要なのか、このフラグメントの意図された動作は何か。

注ことは、あなたの関数find_info()は、(私たちが実際にどちらかの必要はありません)何も返さないこと:代わりにのこの機能プリントTrueまたはFalseそれを返します。

+0

ああ、これは魔法です。どうもありがとうございます!だから私は実際に何かの機能を作成する必要はありませんか?私はちょうどループのために使用することができ、それを1日と呼びますか? – nikkiy

+0

問題の特定のサブ問題を解決し、潜在的にプログラムのさまざまな部分で何度も使用することができる、ロジックの孤立した部分がある場合は、関数が必要です。関数を作成するだけで関数を作成する必要はありません。 –

関連する問題