我想使用文件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
有谁知道如何解决这个问题?
答案 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]
。