You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

py7zr无法识别7z归档文件,如何不提取直接列出其中文件?

解决py7zr识别7z文件失败并列出归档内容的问题

首先,你的代码里有两个关键问题导致了“not a 7z file”错误,咱们一步步来修复:

问题1:文件路径不完整

os.listdir(archivePath)返回的只是文件夹里的文件名,不是完整路径。如果你的脚本运行时的当前工作目录不是archivePath,那么py7zr会在当前目录找这个文件名,而不是你指定的archivePath下,自然找不到正确的文件,工具就误报了文件类型错误。

修复方法很简单,用os.path.join拼接完整路径:

import os

def checkArchive(archivePath):
    for filename in os.listdir(archivePath):
        full_path = os.path.join(archivePath, filename)
        # 先过滤非7z文件,避免无效操作
        if full_path.endswith('.7z'):
            print("Filename is: " + filename)
            cmd = f"py7zr l \"{full_path}\""
            os.system(cmd)

注意这里给路径加了双引号,避免文件名里有空格时命令出错。

问题2:命令行写法错误

你尝试的python -m "py7zr l " + filename写法不对,python -m后面应该直接跟模块名py7zr,然后是子命令和参数,正确的写法是:

cmd = f"python -m py7zr l \"{full_path}\""

更可靠的方案:使用py7zr的Python API

其实没必要调用命令行,直接用py7zr的Python库来读取归档内容,更灵活也不容易出错:

import os
import py7zr

def checkArchive(archivePath):
    for filename in os.listdir(archivePath):
        full_path = os.path.join(archivePath, filename)
        if full_path.endswith('.7z'):
            print("Filename is: " + filename)
            with py7zr.SevenZipFile(full_path, mode='r') as z:
                # 获取所有文件名称列表
                file_list = z.getnames()
                for file in file_list:
                    print(f"- {file}")
                # 如果需要更详细的文件信息(大小、修改时间等),可以用z.list()
                # z.list()

这个方法直接通过API读取归档,不需要依赖命令行环境,还能轻松获取更多文件元数据。

额外排查点

如果还是报错,你可以做这些检查:

  • 确认文件真的是有效的7z归档:用7-Zip官方工具打开试试,排除文件损坏的可能。
  • 确认py7zr版本是最新的:运行pip install --upgrade py7zr更新到最新版,旧版本可能对某些7z格式支持不好。

内容的提问来源于stack exchange,提问作者tryToRunThisCommand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:22:26