【问题标题】:Moving oldest file names with different extensions to common folder. Python将具有不同扩展名的最旧文件名移动到公共文件夹。 Python
【发布时间】:2018-06-29 20:54:10
【问题描述】:

我有一个包含 15 个 .jpg 文件和 15 个 .pdf 文件的文件夹。文件名相同,只是扩展名不同。示例 ABC123.jpg 和 ABC123.pdf。在过去几天的大部分时间里,我一直在尝试使用 shutil 将最旧的 .pdf 文件移动到新文件夹,然后找到匹配的 .jpg 文件并将其移动到与 .pdf 相同的文件夹中。我能够移动最旧的文件或移动给定类型的所有文件。只是无法获得特定类型中最古老的。我尝试将所有 .pdf 文件移动到一个新文件夹 1,将所有 .jpgs 文件移动到一个新文件夹 2,然后将每个文件中最旧的文件移动到一个公共文件夹中。但是,它们并不总是匹配。最旧的 .jpg 可能与最旧的 .pdf 不同。我确信有一个简单的解决方案,我一直在圈子里工作这么久,我再也无法透过树木看到森林了。

【问题讨论】:

标签: python


【解决方案1】:

使用os.path.getmtime 函数作为对文件进行排序的键。

import os
def oldest_file(dir, type):
    return min([name for name in os.listdir(dir) if name.endswith(type)], key=lambda name: os.path.getmtime(os.path.join(dir, name)))
print(oldest('/your/folder', '.jpg'))

如果您需要搜索整棵树,请使用os.walk 而不是os.listdir

import os
from itertools import chain
def oldest_file(dir, type):
    return min(list(chain(*[[os.path.join(root, file) for file in files if file.endswith(type)] for root, _, files in os.walk(dir)])), key=lambda file: os.path.getmtime(file))
print(oldest('/your/folder', '.jpg'))

我相信您可以处理处理移动文件的其余代码。

【讨论】:

    【解决方案2】:

    我从this answer 找到了oldest_file_in_tree

    import os
    import shutil
    
    def oldest_file_in_tree(rootfolder, extension=".avi"):
        return min(
            (os.path.join(dirname, filename)
            for dirname, dirnames, filenames in os.walk(rootfolder)
            for filename in filenames
            if filename.endswith(extension)),
            key=lambda fn: os.stat(fn).st_mtime)
    
    oldest_pdf = oldest_file_in_tree('/var/somedir', '.pdf')
    name = oldest_pdf[:4]
    matching_jpg = '{}.jpg'.format(name)
    
    shutil.move("/var/somedir/{}.pdf".format(name), "path/to/new/destination/{}.pdf".format(name))
    shutil.move("/var/somedir/{}.jpg".format(name), "path/to/new/destination/{}.jpg".format(name))
    

    【讨论】:

    • 起初这不起作用。我收到回溯错误。我稍微更改了代码,并且能够让它工作。
    • @user9679329 感谢您的反馈。你做了哪些改变?我会更新答案。如果这个答案是正确的,您会考虑将 at 标记为接受的答案吗?
    【解决方案3】:

    这就是我如何使它工作..

    import os, shutil
    import glob
    
    todir = '/var/somedir/'
    def oldest_file_in_tree(rootfolder, extension=".pdf"):
        return min(
            (os.path.join(dirname, filename)
            for dirname, dirnames, filenames in os.walk(rootfolder)
            for filename in filenames
            if filename.endswith(extension)),
            key=lambda fn: os.stat(fn).st_mtime)
    
    oldest_g3d = oldest_file_in_tree('/var/somedir/', '.pdf')
    name = oldest_pdf[:-4]
    matching_jpg = '{}.jpg'.format(name)
    
    shutil.move(oldest_pdf, todir)
    shutil.move(matching_jpg, todir)
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多