Python:使用文件ctime和mtime差异备份

时间:2013-10-28 07:36:19

标签: python

我想使用文件ctime和mtime差异备份。但是,字典的设置值不支持多个

fileInfo = {'/root/py/backup_tar/backup.log': [1382945505.0, 1382945505.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/test.tar.gz': [1382945505.0, 1382945505.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/test.pk': [1382945505.0, 1382945505.0]}

old_fileInfo = {'/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/test.pk': [1382945487.0, 1382945487.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/backup.log': [1382945377.0, 1382945377.0]}

difference = dict(set(fileInfo.items())^set(old_fileInfo.items()))
fileNum = len(difference)
print fileNum

difference_file = ' '.join(difference.keys())
print difference_file

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你必须手动循环fileInfo,这里的集合是错误的工具。您可以找到dictionary views的'缺失'项目,这些项目使用了设置操作:

# all items in fileInfo that are not in old_fileInfo
to_backup = fileInfo.viewkeys() - old_fileInfo

# find changed, all items in fileInfo that *are* in old_fileInfo
for f in fileInfo.viewkeys() & old_fileInfo:
    ctime, mtime = fileInfo[f]
    old_ctime, old_mtime = old_fileInfo[f]
    if ctime != old_ctime or mtime != old_mtime:
        to_backup.add(f)

这会生成一组要备份的文件名。

在Python 3中,使用fileInfo.keys()代替fileInfo.dictkeys()。在Python 2.6及更早版本中,使用set(fileInfo)代替fileInfo.dictkeys()

演示:

>>> fileInfo = {'/root/py/backup_tar/backup.log': [1382945505.0, 1382945505.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/test.tar.gz': [1382945505.0, 1382945505.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/test.pk': [1382945505.0, 1382945505.0]}
>>> old_fileInfo = {'/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/test.pk': [1382945487.0, 1382945487.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/backup.log': [1382945377.0, 1382945377.0]}
>>> to_backup = fileInfo.viewkeys() - old_fileInfo
>>> for f in fileInfo.viewkeys() & old_fileInfo:
...     ctime, mtime = fileInfo[f]
...     old_ctime, old_mtime = old_fileInfo[f]
...     if ctime != old_ctime or mtime != old_mtime:
...         to_backup.add(f)
... 
>>> to_backup
set(['/root/py/backup_tar/backup.log', '/root/py/backup_tar/test.tar.gz', '/root/py/backup_tar/test.pk'])

答案 1 :(得分:0)

我不确定你想要什么,因为你不要告诉我们究竟出了什么问题(你得到一个堆栈跟踪吗?那么请告诉我们......),但从你的问题我可以想象你只需要更换带有元组的列表。因此,(1382693438.0, 1382693438.0)代替[1382693438.0, 1382693438.0]