嵌套 if 语句 returns 没有这样的项目
Nested if statement returns no such item
我的 scipt 正在搜索 zip 文件,解压缩并做我想做的事情。但是当我在 zip 文件中嵌套 zip 文件时出现问题,所以我想也许我复制了工作 if 语句,做了一些调整,但我仍然无法让它工作。
print('Searching for ZipFiles')
for file in os.listdir(working_directory):
zfile = file
if zfile.endswith('.zip'):
# Create a ZipFile Object and load sample.zip in it
with ZipFile(zfile, 'r') as zipObj:
# Get a list of all archived file names from the zip
listOfFileNames = zipObj.namelist()
# Iterate over the file names
for fileName in listOfFileNames:
zipObj.extract(fileName, './temp')
maincom() #until here, my script is working, below is the new IF statement
if fileName.endswith('.zip'):
for file in os.listdir('.'):
zfile = file
if zfile.endswith('.zip'):
# Create a ZipFile Object and load sample.zip in it
with ZipFile(zfile, 'r') as zipObj:
# Get a list of all archived file names from the zip
listOfFileNames = zipObj.namelist()
# Iterate over the file names
for fileName in listOfFileNames:
zipObj.extract(fileName, '')
maincom()
我想要实现的是简单地将嵌套的 zip 文件解压缩到它们找到的当前目录中,运行 maincom(),如果可能的话,也许在解压缩完成后删除嵌套的 zip 文件
谢谢大家
试试这个:
import glob
import zipfile
while len(glob.glob(working_directory+"*zip")) != 0:
for filename in glob.glob(working_directory+"*zip"):
with ZipFile(filename, 'r') as zipObj:
for fileName in zipObj.namelist():
zipObj.extract(fileName, './temp')
maincom()
原则上,这将循环直到您的工作目录中不再有 zip 文件。
这意味着:如果 zip 文件在迭代 1 中存在并且包含其他 zip 文件,则将提取这些文件。这意味着:zipfiles 将出现在迭代 2 中。并将被提取。等等等等...
如果您的 zip 文件不是那么大,则无需将任何内容解压缩到磁盘,只需将内容保存在内存中,递归 zip 文件将使用 zipobj.read(filename)
返回的字节对象进行链接。
import ZipFile
from io import BytesIO
def recursiveunziper(zipfile):
with ZipFile(zipfile, 'r') as zipobj:
for filename in zipobj.namelist():
if filename.endswith('.zip'):
recursiveunziper(BytesIO(zipobj.read(filename)))
if filename.contains('foobar')
maincom(zipobj.read(filename)) # sending bytes of foobar files to maincom
for filename in os.listdir(working_directory):
if filename.endswith('.zip'):
recursiveunziper(filename)
我不知道您的 maincom()
是否会 运行 仅在最里面的 zip 文件中或一路上的所有 zip 文件中。在这个例子中,它在所有包含 'foobar' 的文件中都是 运行s 在一路上的所有 zip 文件中。进行调整以使其按您的方式工作。
BytesIO
用于将字节对象转换为可查找的字节对象,就像它是一个文件一样。
我的 scipt 正在搜索 zip 文件,解压缩并做我想做的事情。但是当我在 zip 文件中嵌套 zip 文件时出现问题,所以我想也许我复制了工作 if 语句,做了一些调整,但我仍然无法让它工作。
print('Searching for ZipFiles')
for file in os.listdir(working_directory):
zfile = file
if zfile.endswith('.zip'):
# Create a ZipFile Object and load sample.zip in it
with ZipFile(zfile, 'r') as zipObj:
# Get a list of all archived file names from the zip
listOfFileNames = zipObj.namelist()
# Iterate over the file names
for fileName in listOfFileNames:
zipObj.extract(fileName, './temp')
maincom() #until here, my script is working, below is the new IF statement
if fileName.endswith('.zip'):
for file in os.listdir('.'):
zfile = file
if zfile.endswith('.zip'):
# Create a ZipFile Object and load sample.zip in it
with ZipFile(zfile, 'r') as zipObj:
# Get a list of all archived file names from the zip
listOfFileNames = zipObj.namelist()
# Iterate over the file names
for fileName in listOfFileNames:
zipObj.extract(fileName, '')
maincom()
我想要实现的是简单地将嵌套的 zip 文件解压缩到它们找到的当前目录中,运行 maincom(),如果可能的话,也许在解压缩完成后删除嵌套的 zip 文件
谢谢大家
试试这个:
import glob
import zipfile
while len(glob.glob(working_directory+"*zip")) != 0:
for filename in glob.glob(working_directory+"*zip"):
with ZipFile(filename, 'r') as zipObj:
for fileName in zipObj.namelist():
zipObj.extract(fileName, './temp')
maincom()
原则上,这将循环直到您的工作目录中不再有 zip 文件。
这意味着:如果 zip 文件在迭代 1 中存在并且包含其他 zip 文件,则将提取这些文件。这意味着:zipfiles 将出现在迭代 2 中。并将被提取。等等等等...
如果您的 zip 文件不是那么大,则无需将任何内容解压缩到磁盘,只需将内容保存在内存中,递归 zip 文件将使用 zipobj.read(filename)
返回的字节对象进行链接。
import ZipFile
from io import BytesIO
def recursiveunziper(zipfile):
with ZipFile(zipfile, 'r') as zipobj:
for filename in zipobj.namelist():
if filename.endswith('.zip'):
recursiveunziper(BytesIO(zipobj.read(filename)))
if filename.contains('foobar')
maincom(zipobj.read(filename)) # sending bytes of foobar files to maincom
for filename in os.listdir(working_directory):
if filename.endswith('.zip'):
recursiveunziper(filename)
我不知道您的 maincom()
是否会 运行 仅在最里面的 zip 文件中或一路上的所有 zip 文件中。在这个例子中,它在所有包含 'foobar' 的文件中都是 运行s 在一路上的所有 zip 文件中。进行调整以使其按您的方式工作。
BytesIO
用于将字节对象转换为可查找的字节对象,就像它是一个文件一样。