Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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在两个ZipFile之间传输文件_Python_Transfer_Zipfile - Fatal编程技术网

Python在两个ZipFile之间传输文件

Python在两个ZipFile之间传输文件,python,transfer,zipfile,Python,Transfer,Zipfile,我一直在尝试使用内置的python ZipFile模块在windows上操作一些.zip文件,我希望使用它们在程序中存储一些与当前项目相关的文件。当我从zip加载文件,然后希望将其重新保存到新的、不同的zip文件中时,就会出现问题: import zipfile zp = zipfile.ZipFile(r"first.zip",mode='r') myfile = zp.open(r"stored_file.txt",mode='r') ### Do something, then want

我一直在尝试使用内置的python ZipFile模块在windows上操作一些.zip文件,我希望使用它们在程序中存储一些与当前项目相关的文件。当我从zip加载文件,然后希望将其重新保存到新的、不同的zip文件中时,就会出现问题:

import zipfile
zp = zipfile.ZipFile(r"first.zip",mode='r')
myfile = zp.open(r"stored_file.txt",mode='r')

### Do something, then want to save again ###

zp2 = zipfile.ZipFile(r"second.zip",mode='w')

#Doesn't work, as myfile isn't a real file:
zp2.write(myfile)
#Doesn't work, as the path can't be resolved:
zp2.write(os.path.join(zp.filename,myfile.name))
#The following works... as long as you haven't called read()
#since .seek(0) doesn't work for ZipExtFile
zp2.writestr(myfile.name,myfile.read())
当然,我可以将文件解压缩到某个地方,然后以这种方式将它们重新添加到新的zip,但这样做会很笨重,需要大量清理和创建大量临时文件

同样,我可以跟踪原始zip文件,并通过重新打开该文件来使用writestr方法,但我希望避免它。我只是想知道是否有更好的方法来解决这个问题;这意味着我必须有代码来确定文件是否最初来自zip,如果它来自zip,则以不同的方式处理


编辑:如果其他人对seek0不处理ZipExtFile有最后一个问题,可以使用io.StringIO类保存strmyfile.read的结果,然后可以查看该结果。这意味着我必须将加载的文件保存在内存中,因此我将继续跟踪zipfile并仅在需要时传输它们。

不幸的是,由于zip文件的性质,我认为除了提取和重写到新文件之外,没有其他方法。有关讨论,请参阅。谢谢您的回复,vikramls,有趣的链接。