使用python zipfile命令将类文件替换/添加到jar中的子文件夹

时间:2016-09-21 15:39:30

标签: python jar cmd zip

我有一个jar文件,我有一个代表Jar文件内部位置的路径。

使用这个位置我需要替换jar中的类文件(在某些情况下添加一个类文件)。我在另一个文件夹里面有一个类文件,它存在于jar存在的地方(这个类文件我必须移动到Jar)。

我试图实现上述目标的代码:

 import zipfile
 import os

 zf = zipfile.ZipFile(os.path.normpath('D:\mystuff\test.jar'),mode='a')
 try:
     print('adding testclass.class')
     zf.write(os.path.normpath('D:\mystuff\testclass.class'))
 finally:
     print('closing')
     zf.close()

当我看到下面提到的jar格式时执行上面的代码:

  Jar
   |----META-INF
   |----com.XYZ
   |----Mystuff
          |--testclass.class

我需要的实际输出是 -

   Jar
    |----META-INF
    |----com.XYZ
           |--ABC
               |-testclass.class

如何使用zipfile.write命令或python中的任何其他方式实现此目的?

我没有在write命令中找到任何参数,我可以在Jar / Zip文件中提供目标文件位置。

ZipFile.write(filename,arcname = None,compress_type = None)

1 个答案:

答案 0 :(得分:0)

指定arcname以更改存档中文件的名称。

import zipfile
import os

 zf = zipfile.ZipFile(os.path.normpath(r'D:\mystuff\test.jar'),mode='a')
 try:
     print('adding testclass.class')
     zf.write(os.path.normpath(r'D:\mystuff\testclass.class'),arcname="com.XYZ/ABC/testclass.class")
 finally:
     print('closing')
     zf.close()

注意:我怀疑test.jar是你真正的jar名称,因为你没有保护你的字符串不受特殊字符的影响而且打开的jar文件应该是'D:\mystuff\<TAB>est.jar'(嗯,它不起作用:))

编辑:如果你想添加新文件但删除旧文件,你必须采取不同的做法:你不能从zip文件中删除,你必须重建另一个(受Delete file from zipfile with the ZipFile Module启发)

import zipfile
import os

infile = os.path.normpath(r'D:\mystuff\test.jar')
outfile = os.path.normpath(r'D:\mystuff\test_new.jar')

zin = zipfile.ZipFile(infile,mode='r')
zout = zipfile.ZipFile(outfile,mode='w')
for item in zin.infolist():
    if os.path.basename(item.filename)=="testclass.class":
        pass  # skip item
    else:
        # write the item to the new archive
        buffer = zin.read(item.filename)
        zout.writestr(item, buffer)

print('adding testclass.class')
zout.write(os.path.normpath(r'D:\mystuff\testclass.class'),arcname="com.XYZ/ABC/testclass.class")

zout.close()
zin.close()

os.remove(infile)
os.rename(outfile,infile)