Python 剪切并粘贴到zip文件
我想剪切并粘贴一个文件到zip存档。 一个可能的解决方案是首先将文件写入zip存档,然后将其删除Python 剪切并粘贴到zip文件,python,python-3.x,windows,Python,Python 3.x,Windows,我想剪切并粘贴一个文件到zip存档。 一个可能的解决方案是首先将文件写入zip存档,然后将其删除 import os import zipfile with zipfile.ZipFile('demo.zip', 'a') as myzip: myzip.write('demofile.txt') os.remove("demofile.txt") 但是,文件可能已被其他用户或进程打开。是否有一种方法可以将文件移动到zip,只在写入zip存档和删除文件都是
import os
import zipfile
with zipfile.ZipFile('demo.zip', 'a') as myzip:
myzip.write('demofile.txt')
os.remove("demofile.txt")
但是,文件可能已被其他用户或进程打开。是否有一种方法可以将文件移动到zip,只在写入zip存档和删除文件都是可能的情况下?与剪切粘贴一样?您希望使此操作原子化:要么所有操作都成功,要么所有操作都失败 我认为实现这一点最简单的方法是首先将文件移开:
import tempfile
import shutil
with tempfile.TemporaryDirectory() as tmpdir:
shutil.move("demofile.txt", tmpdir + "/demofile.txt")
with zipfile.ZipFile("demo.zip", "a") as myzip:
myzip.write(tmpdir + "/demofile.txt")
现在,当文件无法移动/删除时,它将在shutil.move
行失败,并且zip文件尚未发生任何变化。如果可以移动该文件,则没有人再打开它,并且删除(现在在离开tempfile.TemporaryDirectory
context时自动执行)不会失败
我使用的是
shutil.move
而不是os.rename
,这样它也可以跨文件系统工作。首先将其移动到临时目录,然后将其写入zipfile,然后删除临时文件?我假设这是在Windows上的(因为如果其他用户或程序已经打开了文件,则不会有什么区别)?谢谢您的回复,是的,您是对的,它在Windows上。如果文件在其他进程中打开,您也不能在文件资源管理器中剪切和粘贴…这正是我想要实现的。因为目前我将该文件放在zip中,无法删除它。因此,在崩溃之前,有两个文件(一个在zip中的文件夹1中)。我希望它在写入zip之前崩溃,并基本上创建一个副本。非常好,谢谢。不知道“原子”定义和映射文件库。