从Python中的zip文件中删除自动生成的_MACOSX文件夹
我有客户端通过web服务器上传的zip文件,其中有时包含讨厌的从Python中的zip文件中删除自动生成的_MACOSX文件夹,python,macos,zip,zipfile,Python,Macos,Zip,Zipfile,我有客户端通过web服务器上传的zip文件,其中有时包含讨厌的\uuuMacOSX目录,会把事情搞砸。我怎样才能去掉这些 我曾想过使用ZipFile,但回答说这是不可能的,并给出了以下建议: 读取归档文件的其余部分并将其写入新的zip文件 如何使用ZipFile?另一种基于Python的替代方法,如shutil或类似的方法也可以。方法是将内容提取到某个已定义的文件夹中,然后删除\uuu MACOSX条目(os.rmdir,os.remove),然后再次压缩它 根据您的操作系统上是否有zip命令,
\uuuMacOSX
目录,会把事情搞砸。我怎样才能去掉这些
我曾想过使用ZipFile
,但回答说这是不可能的,并给出了以下建议:
读取归档文件的其余部分并将其写入新的zip文件
如何使用ZipFile
?另一种基于Python的替代方法,如shutil
或类似的方法也可以。方法是将内容提取到某个已定义的文件夹中,然后删除\uuu MACOSX
条目(os.rmdir
,os.remove
),然后再次压缩它
根据您的操作系统上是否有
zip
命令,您也可以使用或从python控制此命令。下面的示例旨在确定zip文件中是否包含“\u MACOSX”文件。如果这个讨厌的文件存在,那么会创建一个新的zip归档文件,所有不是MACOSX文件的文件都会写入这个新归档文件。此代码可以扩展为包含.ds\u存储文件。如果您需要删除旧的zip文件并替换为新的干净zip文件,请告诉我
希望这些答案能帮助你解决问题
示例一
from zipfile import ZipFile
original_zip = ZipFile ('original.zip', 'r')
new_zip = ZipFile ('new_archve.zip', 'w')
for item in original_zip.infolist():
buffer = original_zip.read(item.filename)
if not str(item.filename).startswith('__MACOSX/'):
new_zip.writestr(item, buffer)
new_zip.close()
original_zip.close()
示例二
def check_archive_for_bad_filename(file):
zip_file = ZipFile(file, 'r')
for filename in zip_file.namelist():
print(filename)
if filename.startswith('__MACOSX/'):
return True
def remove_bad_filename_from_archive(original_file, temporary_file):
zip_file = ZipFile(original_file, 'r')
for item in zip_file.namelist():
buffer = zip_file.read(item)
if not item.startswith('__MACOSX/'):
if not os.path.exists(temporary_file):
new_zip = ZipFile(temporary_file, 'w')
new_zip.writestr(item, buffer)
new_zip.close()
else:
append_zip = ZipFile(temporary_file, 'a')
append_zip.writestr(item, buffer)
append_zip.close()
zip_file.close()
archive_filename = 'old.zip'
temp_filename = 'new.zip'
results = check_archive_for_bad_filename(archive_filename)
if results:
print('Removing MACOSX file from archive.')
remove_bad_filename_from_archive(archive_filename, temp_filename)
else:
print('No MACOSX file in archive.')