【问题标题】:Moving time-range specific files in Python在 Python 中移动时间范围的特定文件
【发布时间】:2016-11-03 21:49:31
【问题描述】:

我是编程新手,我正在处理一项与使用 Python 创建脚本有关的任务,以检测过去 24 小时内创建或修改的一个文件夹中的文件,然后将这些文件移动到不同的目录。

我编写了一个代码,用于打印文件的创建和修改日期,在 该功能还可以整理出旧文件/超过 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 来传输文件,并且已经尝试了一百万种方法——但无法弄清楚!我也在努力把这些变成函数来简化事情。到目前为止,这就是我所拥有的:

    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

对于“移动”函数,我觉得这是正确的想法,但是由于不知道要传递的变量,我将括号留空。 that 返回一个疯狂的长布尔值列表。所以。

    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)

我不确定将哪些变量传递给函数。之后,我正在打印目录以查看文件是否确实已传输。该死的东西不会动。

谢谢!!

【问题讨论】:

  • 您能解释一下,您是如何使用shutil.move 的吗?它出了什么问题?错误信息等?另外,请注意带有反斜杠的路径可能会被错误地解释为反斜杠具有特殊含义(例如在\n 中),因此您必须将其转义"c:\\Users\\…" 或(更好)使用os.path.join
  • 我刚刚更改了我的代码,我将它与原始消息一起放在上面;使用 shutil.move,它只是不移动文件!我正在让程序打印源目录和目标目录,但没有进行传输。

标签: python datetime directory conditional shutil


【解决方案1】:

你快到了。在检测到特定文件符合移动条件(即之前/之后/而不是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

下面的sn-p都是错的,没有必要:

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

这里mtimepathdest不依赖循环变量fname,所以不清楚为什么我们需要在这里循环以及这个片段的预期行为。

请注意,您的函数 find_info()(我们实际上也不需要)不返回任何内容:此函数 prints TrueFalse 而不是 returning 它。

【讨论】:

  • 天哪,这太神奇了。太感谢了!所以我实际上不需要创建任何功能?我可以只使用 for 循环,就这样结束了吗?
  • 如果您的逻辑中有一些孤立的部分可以解决问题的特定子问题并且可能在程序的不同部分中多次使用,则您需要函数。没有必要仅仅为了创建函数而创建函数。
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2013-11-26
  • 2022-10-14
相关资源
最近更新 更多