Python 为什么我的脚本试图解压包含';还没有下载吗?
我有一个Python 3脚本,我正在编写该脚本来完成三件事: 1) 确定应该下载哪些追溯表数据文件 2) 创建wget命令以检索并下载文件 3) 下载文件后,将其解压缩 在Python控制台中测试每个函数时,我没有问题。但是,当我尝试自动执行所有操作时,我会得到以下输出:Python 为什么我的脚本试图解压包含';还没有下载吗?,python,python-3.x,zipfile,Python,Python 3.x,Zipfile,我有一个Python 3脚本,我正在编写该脚本来完成三件事: 1) 确定应该下载哪些追溯表数据文件 2) 创建wget命令以检索并下载文件 3) 下载文件后,将其解压缩 在Python控制台中测试每个函数时,我没有问题。但是,当我尝试自动执行所有操作时,我会得到以下输出: Start Decade: 1930 End Decade: 1950 Creating wget commands... Commands created... Downloaded
Start Decade: 1930
End Decade: 1950
Creating wget commands...
Commands created...
Downloaded 3 files.
Unzipping files...
Traceback (most recent call last):
File "import_pbp.py", line 54, in <module>
unzip_data(decade_files)
File "import_pbp.py", line 39, in unzip_data
with zipfile.ZipFile('zip' + file, 'r') as zip_ref:
File "/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5 /lib/python3.5/zipfile.py", line 1009, in __init__
self.fp = io.open(file, filemode)
FileNotFoundError: [Errno 2] No such file or directory: 'zip1930seve.zip'
解压功能:
# Unzip the data files into the 'unparsed' folder.
def unzip_data(file_list):
print('Unzipping files...')
for file in file_list:
with zipfile.ZipFile('zip' + file, 'r') as zip_ref:
zip_ref.extractall('unparsed/')
print(file + ' unzipped')
print('All files unzipped...')
编辑:我看了回复,但它没有像下面的tdelaney那样完全解释我需要什么。它们是相似的,但就我而言,是不同的。特别是因为这个问题已经问了6年了,我猜从那时起,语言可能发生了重大变化
编辑2:删除不必要的代码以缩短帖子。
os.popen
不会等待过程完成,因此您可以一次启动所有命令,然后在完成之前尝试解压。由于您没有读取从os.popen
返回的stdout
管道,因此如果输出管道已满,您还将面临程序挂起的风险
子流程
模块有几个调用程序的函数。假设您确实希望所有命令并行运行,并且只希望丢弃命令中的任何输出数据,那么您可以将该函数重新实现为
import subprocess as subp
import os
# define function to execute the download commands and unzip
def download_data(commands):
procs = []
for command in commands:
procs.append(subp.Popen(command, shell=True,
stdout=open(os.devnull, 'wb')))
for proc in procs:
proc.wait()
print('Downloaded ' + str(len(commands)) + ' files.')
os.popen()
命令的可能重复不会等到完成后才返回。谢谢!这正好符合我的需要。为什么需要第二个for循环?这是否只是检查以确保每个子进程在其上方的for循环中执行命令后都已完成?进程将保留在进程表中,直到读取其退出状态为止。。。僵尸进程。您需要调用以等待进程完成,否则您将重新解压缩不存在的文件,但也可以避免您自己的个人僵尸在您的系统上出现。您可以重新编写代码以更早地开始解压缩。每个子进程可能有一个线程和一个队列。每个工作人员将运行一个命令,等待完成,并将.zip文件放在一个队列中供侦听器使用。感谢您的额外解释…这非常有帮助!还为我以后改进代码提供了一些想法。干杯
import subprocess as subp
import os
# define function to execute the download commands and unzip
def download_data(commands):
procs = []
for command in commands:
procs.append(subp.Popen(command, shell=True,
stdout=open(os.devnull, 'wb')))
for proc in procs:
proc.wait()
print('Downloaded ' + str(len(commands)) + ' files.')