Python 解压缩后获取解压缩文件的名称
我试图将从zip中提取的文件名指定为可以传递的字符串 以下是我目前的代码:Python 解压缩后获取解压缩文件的名称,python,python-3.x,subprocess,7zip,Python,Python 3.x,Subprocess,7zip,我试图将从zip中提取的文件名指定为可以传递的字符串 以下是我目前的代码: cl = '7z x -ppassowrd Week45_10.zip' args = shlex.split(cl) p = subprocess.call(args) file = open('VENDATA_10', 'r') VENDATA_10是提取的文件名,但是,从zip提取的文件名会有所不同。如何找到提取文件的名称,以便打开该文件的名称,而不是VENDATA_10?您可以捕获流程的输出。7z将打印它提取到
cl = '7z x -ppassowrd Week45_10.zip'
args = shlex.split(cl)
p = subprocess.call(args)
file = open('VENDATA_10', 'r')
VENDATA_10是提取的文件名,但是,从zip提取的文件名会有所不同。如何找到提取文件的名称,以便打开该文件的名称,而不是VENDATA_10?您可以捕获流程的输出。7z将打印它提取到标准输出的文件名。输出可能如下所示:
7-Zip 4.44 beta Copyright (c) 1999-2007 Igor Pavlov 2007-01-20
p7zip Version 4.44 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Processing archive: Week45_10.zip
Extracting VENDATA_10
Everything is Ok
因此,您希望捕获以“提取”开头的行。要捕获输出,您需要将进程的输出通过管道传输到程序中并读取它。您可以使用subprocess
中的communicate()
获得完整输出
为了实现这一点,我对您的代码进行了一些扩展:
from subprocess import Popen, PIPE
import shlex
cl = '7z x -ppassowrd Week45_10.zip'
args = shlex.split(cl)
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
(stdoutdata, stderrdata) = p.communicate()
START_WITH = "Extracting "
N = len(START_WITH)
lines = [line.strip() for line in stdoutdata.split('\n')]
files = [line[N:] for line in lines if line.startswith(START_WITH)]
print files
您应该知道,如果文件已经存在,可能会出现问题,因为
7z
将提示用户是否应该覆盖文件。如果要处理该问题,则还需要控制7z
过程的输入。为此,您可能需要查看pexpect
模块。您可以捕获流程的输出。7z将打印它提取到标准输出的文件名。输出可能如下所示:
7-Zip 4.44 beta Copyright (c) 1999-2007 Igor Pavlov 2007-01-20
p7zip Version 4.44 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Processing archive: Week45_10.zip
Extracting VENDATA_10
Everything is Ok
因此,您希望捕获以“提取”开头的行。要捕获输出,您需要将进程的输出通过管道传输到程序中并读取它。您可以使用subprocess
中的communicate()
获得完整输出
为了实现这一点,我对您的代码进行了一些扩展:
from subprocess import Popen, PIPE
import shlex
cl = '7z x -ppassowrd Week45_10.zip'
args = shlex.split(cl)
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
(stdoutdata, stderrdata) = p.communicate()
START_WITH = "Extracting "
N = len(START_WITH)
lines = [line.strip() for line in stdoutdata.split('\n')]
files = [line[N:] for line in lines if line.startswith(START_WITH)]
print files
您应该知道,如果文件已经存在,可能会出现问题,因为
7z
将提示用户是否应该覆盖文件。如果要处理该问题,则还需要控制7z
过程的输入。您可能需要查看pexpect
模块以了解这一点。您知道其他信息吗,例如文件将被提取到哪里或归档的内容是什么?目前,文件将在我的主目录(/home/user/)中提取;zipfile解压将是一个或多个文本文件。zipfile
模块应该能够读取文件目录,即使它无法解压(即,如果使用7z特定压缩)。您知道任何其他信息,例如文件将解压到何处或存档的内容是什么吗?目前,文件将在我的主目录(/home/user/)中解压缩;zipfile解压缩将是一个或多个文本文件。zipfile
模块应该能够读取文件目录,即使它无法解压缩(即,如果使用7z特定压缩)。