7zip工具介绍及非英文字符压缩包实战 | 豆包MarsCode AI刷题

392 阅读5分钟

7zip工具介绍 | 豆包MarsCode AI刷题

7zip是一款开源的文件压缩和解压缩工具,广受用户好评,具有以下主要特点:

  1. 多格式支持:除了其原生的7z格式,7zip还支持其他常见的压缩格式,如ZIP、RAR、TAR等。
  2. 高压缩率:使用7z格式进行压缩,通常可以获得比其他格式更高的压缩率。
  3. 开源和免费:7zip是完全免费的,且其源代码是开放的,这使得它得到了许多开发者和社区的支持。
  4. 跨平台:原生支持Windows,但也有其他平台的版本,如Linux下的p7zip。
  5. 文件管理:除了压缩和解压功能外,7zip还提供了一个简单的文件管理器,用于浏览和编辑文件。 7zip由于其出色的压缩性能、简洁的用户界面和开源的特点,已经成为许多用户的首选压缩工具。

我为什么选择7zip?

多格式支持

7zip支持的众多格式带来了便捷,从linux常用的xz到Windows特有的wim,再到only apple can do的dmg,甚至能打开诸如ARJ、CAB、CHM、CPIO、CramFS、DEB、FAT、HFS、ISO、LZH、LZMA、MBR、MSI、NSIS、NTFS、RAR、RPM、SquashFS、UDF、VHD、XAR等等压缩文件

image-20231031220023204

高压缩率

基于LZMA 与LZMA2 算法的7z格式能租到高压缩比和高速度,虽然没有rar一般能提供记录文件恢复功能,也已经是足够强大了 image-20231031220152702

开源与免费

这是相对于bandizip和winrar的好处:开源.由于7zip遵循LGPL,你遇到错误可以自己提PR,也可以自己找中意的fork,而闭源软件就没这么幸运了

image-20231031220537761

高度的自由

丰富的可选项能给你高度的自由,让你的压缩文件行为变的尽可能符合预期,甚至你可以规定压缩用几核

image-20231031215413032

如何安装

Windows:

# 使用scoop进行安装 
scoop update scoop search 7zip
scoop install 7zip
# 或者进行全局安装
# scoop install 7zip -g <br>

Linux (例如 Ubuntu):

# 使用apt进行安装 <br> 
sudo apt update  sudo apt install p7zip-full

开始使用

  1. 图形用户界面(GUI)操作:

打开7zip后,你会看到一个类似文件管理器的界面。

image-20231031220951188

压缩文件/文件夹:

选择你要压缩的文件或文件夹。 点击工具栏上的“添加”按钮。 在弹出的窗口中选择压缩格式(例如7z或ZIP)。 可以设置压缩级别、密码等。 点击“确定”完成压缩。

image-20231031221010519

解压文件:

选择压缩文件。 点击工具栏的“解压”按钮。 选择解压位置。 如果文件设置了密码,记得输入密码。 点击“确定”进行解压即可

  1. 右键菜单操作:

在文件管理器中,你也可以直接使用右键菜单操作7zip。

压缩: 右键选择文件/文件夹 -> 选择7zip -> “添加到存档”。

解压: 右键点击压缩文件 -> 选择7zip -> “解压到”或“解压到...\文件夹名”。

  1. 命令行操作 (适用于高级用户):

你可以使用7z命令在命令行中操作。

压缩:

bash 7z a [压缩文件名.7z] [要压缩的文件/文件夹] 

例如:

bash 7z a myarchive.7z myfolder/ 

image-20231031221215919

解压:

bash  7z x [压缩文件名.7z] -o[解压路径] 

例如

bash Copy code <br>7z x myarchive.7z -o./extracted/ 

注意:

如果你设置了密码,命令行操作时可能需要添加-p[你的密码]参数。当然,我更推荐用图形化页面 在使用命令行操作时,建议在不懂的时候通过7z --help命令获取。

文件名编码检测与重命名问题处理

在使用 7zip 解压带有非英文字符的压缩包时,可能会遇到乱码或无法识别的文件名,特别是在 Windows 系统上。因此我们可以询问豆包MarsCode AI,借助AI赋能解决问题。 以下是一些询问豆包大模型得到的实战技巧,用于检测和修复文件名的编码问题。

方法一:进一步尝试 UTF-8 和 GBK 双重尝试

如果文件名因为编码问题无法正确解码,可以通过代码自动切换不同编码进行尝试。以下 Python 示例代码展示了如何通过 chardet 库进行编码检测,并自动切换编码进行重命名:

import os
import chardet
def rename_files_in_directory(directory):
    for root, dirs, files in os.walk(directory):
        for name in files + dirs:
            try:
                # 尝试使用 ISO-8859-1 编码的文件名并检测编码
                encoded_name = name.encode('iso-8859-1')
                result = chardet.detect(encoded_name)
                detected_encoding = result['encoding']
                # 尝试按检测到的编码解码
                try:
                    new_name = encoded_name.decode(detected_encoding)
                except (UnicodeDecodeError, TypeError):
                    # 如果检测到的编码无效,依次尝试 UTF-8 和 GBK
                    try:
                        new_name = encoded_name.decode('utf-8')
                    except UnicodeDecodeError:
                        new_name = encoded_name.decode('gbk')
                old_path = os.path.join(root, name)
                new_path = os.path.join(root, new_name)
                
                # 执行重命名
                os.rename(old_path, new_path)
                print(f"重命名文件 {old_path}{new_path}")
            except Exception as e:
                print(f"无法重命名文件 {name}: {e}")
# 指定解压文件的目录路径
directory_path = r'C:\Users\nbdhc\Downloads\temp'
rename_files_in_directory(directory_path)
方法二:使用 unidecode 库进行非 ASCII 字符转换

如果上述方法依然无法解决问题,可以使用 unidecode 库将非 ASCII 字符转换为近似拼音。这样可以有效避免因编码问题导致的文件名乱码。

安装 unidecode

pip install unidecode

修改代码如下:

import os
import chardet
from unidecode import unidecode

def rename_files_in_directory(directory):
    for root, dirs, files in os.walk(directory):
        for name in files + dirs:
            try:
                encoded_name = name.encode('iso-8859-1')
                result = chardet.detect(encoded_name)
                detected_encoding = result['encoding']

                try:
                    new_name = encoded_name.decode(detected_encoding)
                except (UnicodeDecodeError, TypeError):
                    try:
                        new_name = encoded_name.decode('utf-8')
                    except UnicodeDecodeError:
                        new_name = encoded_name.decode('gbk')
                
                # 转换为 ASCII 近似拼音
                new_name = unidecode(new_name)
                old_path = os.path.join(root, name)
                new_path = os.path.join(root, new_name)

                os.rename(old_path, new_path)
                print(f"重命名文件 {old_path}{new_path}")
            except Exception as e:
                print(f"无法重命名文件 {name}: {e}")

# 指定解压文件的目录路径
directory_path = r'C:\Users\nbdhc\Downloads\temp'
rename_files_in_directory(directory_path)

通过这种方式,可以尽可能解决文件名中的编码问题,并将无法处理的字符替换为 ASCII 字符。