-1

我想使用文件 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

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

4

2 回答 2

1

您必须fileInfo手动循环,集合在这里是错误的工具。您可以使用字典视图找到“缺失”项目,这些视图确实使用集合操作:

# 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'])
于 2013-10-28T07:44:36.747 回答
0

我不确定你想要什么,因为你不要告诉我们到底出了什么问题(你有堆栈跟踪吗?然后请告诉我们......),但从你的问题我可以想象你只需要用元组。所以,(1382693438.0, 1382693438.0)而不是[1382693438.0, 1382693438.0].

于 2013-10-28T07:39:58.240 回答