Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 剪切并粘贴到zip文件_Python_Python 3.x_Windows - Fatal编程技术网

Python 剪切并粘贴到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存档和删除文件都是

我想剪切并粘贴一个文件到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之前崩溃,并基本上创建一个副本。非常好,谢谢。不知道“原子”定义和映射文件库。