如何使用python找到一个zip文件,解压缩它,在其中找到一个特定文件?

时间:2018-08-08 01:32:12

标签: python python-3.x

我需要 1)在特定目录位置找到一个zipfile 2)如果存在,则将其解压缩 3)在其内容之外找到一个特定文件,并将其移至其他目录。

def searchfile():
for file in os.listdir('/user/adam/datafiles'):
    if fnmatch.fnmatch(file, 'abc.zip'):
        return True
return False

如果searchfile():

print('File exists')

其他:

print('File not found')

def file_extract():

    os.chdir('/user/adam/datafiles')
    file_name = 'abc.zip'
    destn = '/user/adam/extracted_files'
    zip_archive = ZipFile (file_name)
    zip_archive.extract('class.xlsx',destn)
    print("Extracted the file")
    zip_archive.close()

search_file

file_extract

当我执行上面的脚本时,它没有显示编译时问题或运行时问题。但它仅适用于第一个功能。当我检查extracte_files文件夹中的文件时,看不到文件。

2 个答案:

答案 0 :(得分:0)

您定义的found唯一位置在if块中,因此,如果找不到abc.zip,则found将是未定义的。但是,即使找到了abc.zip并定义了found,它也被定义为searchfile()的局部变量,您的主作用域将无法访问它。您应该在主作用域中将其初始化为全局变量,并在searchfile()中将其声明为全局变量,以便对其所做的修改可以反映在主作用域中:

def searchfile():
    global found
    for file in os.listdir('/user/adam/datafiles'):
        if fnmatch.fnmatch(file, 'abc.zip'):
            found = True

found = False
searchfile()
if found:
    print('File exists')
else:
    print('File not found')

但是实际上并不需要使用全局变量,因为您可以简单地从found返回searchfile()作为返回值:

def searchfile():
    for file in os.listdir('/user/adam/datafiles'):
        if fnmatch.fnmatch(file, 'abc.zip'):
            return True
    return False

if searchfile():
    print('File exists')
else:
    print('File not found')

答案 1 :(得分:0)

请注意,您从未真正调用过searchfile(),即使您调用过found,如果abc.zip不匹配也不会被定义。

如果要在单独的函数中进行文件搜索(这是个好主意),则最好将其 return 返回为成功/失败布尔值,而不要依赖于全局变量。

所以您可能想要这样的东西:(注意:代码未经测试)

import os
import fnmatch
import zipfile

def searchfile():
        for file in os.listdir('/user/adam/datafiles'):
                if fnmatch.fnmatch(file, 'abc.zip'):
                        return True  # <-- Note this
        return False  # <-- And this

if searchfile():  # <-- Now call the function and use its return value
        print('File exists')
else:
        print('File not found')