Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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中的zip文件中删除自动生成的_MACOSX文件夹_Python_Macos_Zip_Zipfile - Fatal编程技术网

从Python中的zip文件中删除自动生成的_MACOSX文件夹

从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命令,

我有客户端通过web服务器上传的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.')