<p>我真的写过这样的东西!不过,我是靠记忆工作的。这作为一个单独的模块很有用,因为以这种方式备份文件是相当常见的。在</p>
<pre><code># /backup_dash_one.py
import os, glob, re
def backup(full_path, num_backups=None):
"""Usage: backup('example/pathname.ext', [num_backups])
returns: example/pathname-1.ext, advances all backups by 1
Given example/pathname.ext, creates backups named
example/pathname-1.ext, -2.ext, -3.ext until there are
as many backups as num_backups, purging those older."""
head, tail = os.path.split(full_path)
tailname, tailext = os.path.splitext(tail)
def find_backup_num(path):
return int(re.search(r"-(\d+)\.[^.\\/]*", path).group(1))
paths = sorted(glob.glob(os.path.join(head,tailname)+"-*"+tailext),
key=find_backup_num)
for path in reversed(paths[:]):
head_tail, backup_num, ext, _* = re.split(r"-(\d+)(\.[^\\./]*)$", path)
new_path = head_tail + "-" + str(int(backup_num)+1) + ext
with open(path) as infile, open(new_path,'w') as outfile):
for line in infile:
outfile.write(line)
if new_path not in paths:
paths.append(new_path)
while num_backups and len(paths) > num_backups:
os.remove(paths[-1])
paths.pop()
</code></pre>
<p>就我个人而言,如果我真的有时间去做这件事,我会做更多的研究,做一些类似的事情:</p>
^{pr2}$
<p>所以你可以这样做:</p>
<pre><code>with BackupFile("path/to/file/that/needs/backups.txt", 'r+', num_backups=12) as f:
make_change(f)
# ta-da it's backed up!
</code></pre>
<p>不过,我根本没有太多的机会来测试这一点,所以我猜它有点不对劲:)</p>