如何提取损坏的压缩包文件

作者:matrix 发布时间:2020年5月19日星期二 分类:零零星星

有些压缩包损坏之后无法正常解压,尝试修复压缩包之后再忽略错误解压其实就可以提取出所有文件了,但是损坏的文件取出来不能保证完整性。

待修复文件: 华为主题压缩包 3.zip

尝试提取/unlock/manifest.xml文件

方法1. windows下手动操作

windows下尝试使用7z直接打开会提示错误,看不到里面任何内容。

  1. 先用WinRAR修复压缩包:工具 -> 修复压缩文件
  2. 7zip工具打开修复之后的压缩包,然后点击顶部的提取按钮就可以取出来啦

图片5202-Winrar+7z 提取损坏的压缩包文件

方法2. *unix下执行脚本

  • 确保正常使用zip,unzip命令

  • 下面代码保存为repair_zip.sh文件

  • 执行bash repair_zip.sh bla-bla.zip

尝试解压提取出bla-bla.zip所有文件,资料会提取到相同位置的bla-bla_repaired目录。

macos下测试可用。

gist: https://gist.github.com/Hootrix/1d5d96d95dc5238e170405c77d54f02f

#!/bin/bash
file=$1
dir=`dirname $file`

# 检测文件存在
if [ ! -f $file ];then
    echo "404: file not found"
    exit 1
fi

# 检测zip命令
if ! type "zip" > /dev/null; then
    echo "500: command not found. Please execute install >  apt-get/yum install zip"
    exit 1
fi


file_name=`echo $file | awk -F . '{print $1}'|awk -F '/' '{print $(NF)}'` # 截取文件名
save_path=$dir/"$file_name"_repaired # 修复后提取存放路径
echo -e "extract file: $file"
echo -e "processing... ... "

repaired_zip_package=$dir/"$file_name"_repaired.zip #修复后的压缩包路径

zip -FF $file  --out $repaired_zip_package && unzip $repaired_zip_package -d $save_path 
sleep 1;unlink $repaired_zip_package

echo -e " \e[0;32msuccessful: $save_path\e[0m"

参考:
https://superuser.com/questions/23290/terminal-tool-linux-for-repair-corrupted-zip-files

python 快速读取压缩包内文件

作者:matrix 发布时间:2019年10月14日星期一 分类:Python

搜索结果一大堆但都没有找到支持url和local path两种读取方式的操作。
留着便于以后直接使用。

gits: https://gist.github.com/Hootrix/cf3e75b1fa6d3d404bc99787f89687f1


import requests,tempfile, zipfile,os def read_file_for_zip(zip_url, callback=None): """ 读取zip包内的文件 :param zip_url:zip路径/url :param callback:读取操作的回调函数 若函数返回false 则不会读取下一个文件 :return: """ with tempfile.TemporaryFile('w+b') as tmpfile: # 生成临时文件 # 判断是否为本地文件 if os.path.isfile(zip_url): #进行本地复制。没必要 # with open(zip_url,'rb') as f: # while True: # chunk = f.read(1024) # if not chunk: # break # tmpfile.write(chunk) tmpfile = zip_url else:#进行http请求 r = requests.get(zip_url, stream=True) for chunk in r.iter_content(chunk_size=1024): if chunk: tmpfile.write(chunk) assert zipfile.is_zipfile(tmpfile), '不是zip文件' zf = zipfile.ZipFile(tmpfile) for name in zf.namelist(): # list e.g. ['Brave Browser.url', 'Express VPN.url', 'ssl.txt', 'What is my IP.url'] if callable(callback): # zf.read(name) #读取 if callback(name, zf) is False:# 函数返回false 会终止下一个文件的读取 break ### 例子 def cb(filename,context): if filename.endswith('.txt'): print(context.read(filename).decode('utf-8')) # print( context.read(filename)) return False #终止下一个文件的读取 read_file_for_zip('https://cdn-01.openload.cc/S9Y7m488n8/22c3c58b-1571037628/ssl_proxies.zip',cb)

具体使用见上面例子
兼容大文件url的下载处理

p.s.
在线压缩包读取:
https://extract.me/cn/

参考:

http://www.liujiangblog.com/course/Python/62

https://docs.python.org/2/library/tempfile.html