【问题标题】:Delete the last 3 versions folders - Python删除最后 3 个版本的文件夹 - Python
【发布时间】:2017-04-21 01:44:46
【问题描述】:

我有一个包含一些软件版本的树,我需要保留最后 3 个版本。

我有这样的树文件夹:

版本:

文件夹:

'10.7.0.290'、'10.7.0.289'、'10.7.0.281'、'10.7.0.278'、'10.7.0.275'

'10.6.7.282'、'10.6.7.277'、'10.6.7.274'、'10.6.7.270'

我想保留每个版本的 last 3 文件夹,例如在这种情况下,我想保留 '10.7.0.yyy' 和 ' 的 last 3 10.6.7.xxx 版本:

'10.7.0.290'、'10.7.0.289'、'10.7.0.281'

'10.6.7.282'、'10.6.7.277'、'10.6.7.274'

并删除:

'10.7.0.278', '10.7.0.275'

'10.6.7.270'

但我的脚本只保留最后 3 个,而不是每个版本:

脚本:

import os
import re
import shutil

versions = []
folders = []
a = os.listdir('.')
a.sort(reverse=True)
sorted(a)

for fn in a:
    folders.append(fn)
    if os.path.isdir(fn):
        version = (re.match('^([0-9]+\.[0-9]+\.[0-9]+).*', fn)).group(1)
        if (version) not in versions:
            versions.append(version)

result = []


for version in versions:
    temp = []
    for folder in folders:
        if folder.startswith(version):
            temp.append(folder)

    result.append(temp)
print result    

for version in result:
   for i in range(max(len(version) - 3, 0)):
       print version[i]
 #   shutil.rmtree(version[i])

结果

10.7.0.290 #this files are deleted
10.7.0.289 #this files are deleted
10.6.7.282 #this files are deleted

【问题讨论】:

    标签: python python-2.7 directory


    【解决方案1】:

    让我们指出所需的步骤。

    1. 使用os.listdir 获取给定路径中所有目录的列表。
    2. 对列表进行排序并通过切片列表获取前 3 个目录名称
    3. 使用shutil.rmtree 在循环中删除它们。

    所以,解决方案应该是:

    from os import listdir
    import shutil
    
    directories_to_delete = sorted(listdir('desired/path'))[:3]
    for directory in directories_to_delete:
        shutil.rmtree(directory)
    

    【讨论】:

    • 按字符串排序结果版本10被认为早于9
    • 我只考虑了提到的输入。不过你倒是挺合乎逻辑的,我会尽快更新的。
    【解决方案2】:

    您可以将文件夹名称转换为int 的列表。这将允许版本的正确排序,以便10 被认为晚于9。然后您可以按相反的顺序对它们进行排序,并使用groupby 根据前三个组件对它们进行分组。然后对于每个组,您可以使用 dropwhile 丢弃前 3 个项目并删除其余项目:

    from itertools import groupby, dropwhile
    
    FOLDERS = [
        '10.7.0.290', '10.7.0.289', '10.7.0.281', '10.7.0.278', '10.7.0.275',
        '10.6.7.282', '10.6.7.277', '10.6.7.274', '10.6.7.270'
    ]
    
    components = ([int(x) for x in fn.split('.')] for fn in FOLDERS)
    for _, g in groupby(sorted(components, reverse=True), key=lambda x: x[:3]):
        for _, fn in dropwhile(lambda x: x[0] < 3, enumerate(g)):
            print 'Remove {}'.format('.'.join(str(x) for x in fn))
    

    输出:

    Remove 10.7.0.278
    Remove 10.7.0.275
    Remove 10.6.7.270
    

    【讨论】:

    • 其实我误解了这个问题,你的问题是正确的,赞成。
    【解决方案3】:

    这样的事情会起作用:

    import os
    import shutil
    
    from collections import defaultdict
    
    
    versions = defaultdict(list)
    directories = next(os.walk('.'))[1]
    for directory in directories:
        major, minor, patch, minor_patch = directory.split('.')
        versions['{}.{}.{}'.format(major, minor, patch)].append(int(minor_patch))
    
    for version, minor_patches in versions.items():
        minor_patches.sort(reverse=True)
        to_remove = minor_patches[3:]
        for minor_patch in to_remove:
            path = '{}.{}'.format(version, minor_patch)
            shutil.rmtree('./{}'.format(path))
    

    例子:

    [$:/tmp/folders] $ tree
    .
    ├── 10.6.7.270
    ├── 10.6.7.274
    ├── 10.6.7.277
    ├── 10.6.7.282
    ├── 10.7.0.275
    ├── 10.7.0.278
    ├── 10.7.0.281
    ├── 10.7.0.289
    ├── 10.7.0.290
    └── folders.py
    
    9 directories, 1 file
    [$:/tmp/folders] $ python folders.py 
    [$:/tmp/folders] $ tree
    .
    ├── 10.6.7.274
    ├── 10.6.7.277
    ├── 10.6.7.282
    ├── 10.7.0.281
    ├── 10.7.0.289
    ├── 10.7.0.290
    └── folders.py
    
    6 directories, 1 file
    

    【讨论】:

    • 如果我有一个带有 10.6.7.274.22 的文件夹出现异常并中止...如果我在文件夹中有其他文件的名称不正确而不是 xx.yy.zz.aa 中止错误如下 ValueError: 需要多个值
    猜你喜欢
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2016-01-12
    • 2021-11-22
    相关资源
    最近更新 更多