如何避免tf.keras.utils.get_file()解压tar时生成._开头重复文件
解决
tf.keras.utils.get_file解压生成._*前缀多余文件的方法 你遇到的._*前缀文件是macOS系统特有的AppleDouble元数据文件,通常是源压缩包在macOS环境下打包时被默认加入的,并非tf.keras.utils.get_file主动生成,该工具自带的解压逻辑没有内置过滤规则,你可以通过以下方法解决:
方案1:修改源压缩包(适用于你可以控制打包流程的场景)
在macOS环境下执行打包命令前,先设置COPYFILE_DISABLE=1环境变量,即可避免把元数据写入压缩包:
COPYFILE_DISABLE=1 tar -czf 你的压缩包名称.tgz 待打包的目录路径
替换源站的压缩包后,再调用get_file开启untar=True就不会解压出多余文件。
方案2:手动解压过滤(适用于无法修改源压缩包的场景)
关闭get_file的自动解压功能,拿到下载的压缩包路径后用Python的tarfile模块手动过滤后解压,示例代码如下:
import tarfile import tensorflow as tf # 仅下载压缩包,不自动解压 downloaded_tgz_path = tf.keras.utils.get_file( fname=<你要保存的文件名>, origin=<tgz资源地址>, untar=False ) # 手动解压,过滤所有._开头的元数据文件 extract_target_dir = downloaded_tgz_path.rsplit('.', 1)[0] # 也可以自定义解压路径 with tarfile.open(downloaded_tgz_path, 'r:gz') as tar: valid_members = [ member for member in tar.getmembers() if not member.name.startswith('._') and '/._' not in member.name ] tar.extractall(path=extract_target_dir, members=valid_members)
方案3:事后清理
如果坚持使用get_file自带的解压逻辑,可以在解压完成后遍历目录批量删除所有._开头的文件:
import os def clean_macos_metadata(root_dir): for dirpath, dirnames, filenames in os.walk(root_dir): for f in filenames: if f.startswith('._'): os.remove(os.path.join(dirpath, f)) # 传入你的解压目录调用即可 clean_macos_metadata(<你的解压目录路径>)
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

