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

问题描述 投票:0回答:3

我有客户端通过网络服务器上传的 zip 文件,这些文件有时包含令人讨厌的

__MACOSX
目录,使事情变得混乱。我怎样才能删除这些?

我想过使用

ZipFile
,但是this答案说这是不可能的,并给出了这个建议:

读出存档的其余部分并将其写入新的 zip 文件。

如何使用

ZipFile
做到这一点?另一个基于 Python 的替代方案,如
shutil
或类似的东西也可以。

python macos zip
3个回答
4
投票

下面的示例旨在确定 zip 文件中是否包含“__MACOSX”文件。 如果这个讨厌的存在,则会创建一个新的 zip 存档,并且所有不是 __MACOSX 文件的文件都将写入此新存档。 可以扩展此代码以包含 .ds_store 文件。 如果您需要删除旧的 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.')

0
投票

想法是使用 ZipFile 将内容提取到某个定义的文件夹中,然后删除

__MACOSX
条目(
os.rmdir
os.remove
),然后再次压缩。

根据操作系统上是否有

zip
命令,您可能能够 跳过重新压缩部分。您也可以使用 os.systemsubprocess 模块从 python 控制此命令。


0
投票

以下是我为解决烦人的 macOS 问题而采取的一些步骤。

  1. 打开 shell 配置文件(如
    .bashrc
    .zshrc
    )。例如:
nano ~/.bashrc
  1. 在文件末尾添加以下函数:
zipar() {
    if [ "$#" -ne 2 ]; then
        echo "Usage: zipar <name_of_file.zip> <path/to/folder>"
        return 1
    fi
    zip -r "$1" "$2" -x "*.DS_Store" -x "__MACOSX"
}
  1. 保存文件并退出编辑器(在

    nano
    中,使用
    Ctrl+O
    保存并使用
    Ctrl+X
    退出)。

  2. 重新加载终端以应用更改:

现在您可以在终端中使用

zipar
命令通过指定
.zip
文件的名称和文件夹路径来创建
.DS_Store
文件(不包括
__MACOSX
.zip
)。例如:

zipar my_compressed_file.zip path/to/folder

这将在指定目录中创建一个

my_compressed_file.zip
,仅此而已。

只让你知道:

.DS_Store(桌面服务存储)是一个隐藏文件,包含其封闭文件夹的属性,例如图标大小显示。 __MACOSX 文件夹是在 zip 过程中创建的,包含有关压缩文件的元数据。

© www.soinside.com 2019 - 2024. All rights reserved.