Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的脚本试图解压包含';还没有下载吗?_Python_Python 3.x_Zipfile - Fatal编程技术网

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

我有一个Python 3脚本,我正在编写该脚本来完成三件事:

1) 确定应该下载哪些追溯表数据文件 2) 创建wget命令以检索并下载文件 3) 下载文件后,将其解压缩

在Python控制台中测试每个函数时,我没有问题。但是,当我尝试自动执行所有操作时,我会得到以下输出:

    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.')