解压缩后获取提取文件的名称
Getting name of extracted file after unzipping
我正在尝试将从 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 会将提取的文件名打印到标准输出。输出可能如下所示:
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
所以您想捕获以 "Extracting " 开头的行。要捕获输出,您需要将流程的输出通过管道传输到您的程序中并读取它。您可以使用 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
模块。
我正在尝试将从 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 会将提取的文件名打印到标准输出。输出可能如下所示:
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
所以您想捕获以 "Extracting " 开头的行。要捕获输出,您需要将流程的输出通过管道传输到您的程序中并读取它。您可以使用 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
模块。