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
相关产品推荐
相关产品推荐

