Python在两个ZipFile之间传输文件
我一直在尝试使用内置的python ZipFile模块在windows上操作一些.zip文件,我希望使用它们在程序中存储一些与当前项目相关的文件。当我从zip加载文件,然后希望将其重新保存到新的、不同的zip文件中时,就会出现问题: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
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,有趣的链接。