python3脚本压缩目录并动态命名存档

python3脚本压缩目录并动态命名存档,python,python-3.x,Python,Python 3.x,我正在尝试编写一个python 3脚本,它将压缩目录/home/pi/results的内容,并将其复制到另一个文件夹/home/pi/backups 我需要能够多次运行此脚本,每次,生成的归档文件都根据以前的归档文件命名。因此,第一次运行将创建backup001.tgz,第二次运行将创建backup002.tgz,等等。每个备份都将是包含该目录中任何内容的完整备份 我已经知道了如何将文件夹压缩到.tgz,但我就是不知道如何根据以前的备份向其添加数字 tar=tarfile.open(backup

我正在尝试编写一个python 3脚本,它将压缩目录
/home/pi/results
的内容,并将其复制到另一个文件夹
/home/pi/backups

我需要能够多次运行此脚本,每次,生成的归档文件都根据以前的归档文件命名。因此,第一次运行将创建
backup001.tgz
,第二次运行将创建
backup002.tgz
,等等。每个备份都将是包含该目录中任何内容的完整备份

我已经知道了如何将文件夹压缩到
.tgz
,但我就是不知道如何根据以前的备份向其添加数字

tar=tarfile.open(backupdir+'backup.tgz', "w:gz")
            tar.add(resultspath, arcname=os.path.basename(resultspath))
            tar.close()

这将为您提供最新的文件名。下一个可以从这个名字中找到。

可能使用时间戳?然后,您将一眼就知道您要寻找的是哪种特定的备份

import datetime   

date = datetime.datetime.utcnow().isoformat()
filename = 'backup-{}.tgz'.format(date)
filepath = os.path.join(backupdir, filename)

tar=tarfile.open(filepath, "w:gz")
        tar.add(resultspath, arcname=os.path.basename(resultspath))
        tar.close()

您可以尝试一种过滤/计数方法:

# we set the path, and the word key that we are looking for
path = '/home/user/backups'
word_key = 'backup-'

# we count the occurrences and generate a new filename from it
backups_count = len(filter(lambda x : word_key in x, os.listdir(path)))
filename = 'backup-{}.tgz'.format(backups_count)
用于获取已存在备份的列表
使用
max()
with查找最后一个
用于创建下一个文件名

import glob
filelist = glob.glob('Backup???.tgz')
last = max(filelist, key = lambda x: x[6:9])
filename = 'Backup{0:03d}.tgz'.format(int(last[6:9])+1)
print filename

(对于包含
Backup001.tgz
Backup002.tgz
的目录,输出
Backup003.tgz

虽然严格来说不是我要问的,但最好使用时间戳。我将它从utcnow()改为now(),以使用我的时区。唯一的问题是时间部分包含冒号,tar显然在文件名中有问题。我得弄清楚如何将冒号改为下划线,今晚下班后我会这么做。
date=datetime.datetime.utcnow().strftime(“%b_%d_%Y_%H_%M_%S”)
@Lightmaster检查可以在strftime方法中添加哪些其他变量。无论如何,如果这是一个更好的答案,你可以批准这个答案。我更改了日期时间代码以符合我的需要,但这正是我所需要的。谢谢。@Lightmaster我真的很高兴能帮助你。谢谢。虽然这在技术上正是我想要的,但@turkus提供的带有时间编码文件名的答案对我来说更合适。我点击了“向上投票”图标来获得你的答案,但很显然,在他们出现之前,我必须获得15的声誉。
import glob
filelist = glob.glob('Backup???.tgz')
last = max(filelist, key = lambda x: x[6:9])
filename = 'Backup{0:03d}.tgz'.format(int(last[6:9])+1)
print filename