我有一个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)
答案 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)