我有客户端通过网络服务器上传的 zip 文件,这些文件有时包含令人讨厌的
__MACOSX
目录,使事情变得混乱。我怎样才能删除这些?
我想过使用
ZipFile
,但是this答案说这是不可能的,并给出了这个建议:
读出存档的其余部分并将其写入新的 zip 文件。
如何使用
ZipFile
做到这一点?另一个基于 Python 的替代方案,如 shutil
或类似的东西也可以。
下面的示例旨在确定 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.')
想法是使用 ZipFile 将内容提取到某个定义的文件夹中,然后删除
__MACOSX
条目(os.rmdir
、os.remove
),然后再次压缩。
根据操作系统上是否有
zip
命令,您可能能够 跳过重新压缩部分。您也可以使用 os.system 或 subprocess 模块从 python 控制此命令。
以下是我为解决烦人的 macOS 问题而采取的一些步骤。
.bashrc
或 .zshrc
)。例如:nano ~/.bashrc
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"
}
保存文件并退出编辑器(在
nano
中,使用 Ctrl+O
保存并使用 Ctrl+X
退出)。
重新加载终端以应用更改:
现在您可以在终端中使用
zipar
命令通过指定 .zip
文件的名称和文件夹路径来创建 .DS_Store
文件(不包括 __MACOSX
和 .zip
)。例如:
zipar my_compressed_file.zip path/to/folder
这将在指定目录中创建一个
my_compressed_file.zip
,仅此而已。
只让你知道:
.DS_Store(桌面服务存储)是一个隐藏文件,包含其封闭文件夹的属性,例如图标大小显示。 __MACOSX 文件夹是在 zip 过程中创建的,包含有关压缩文件的元数据。