Python 迭代文件夹和打印文件名的顺序错误

Python 迭代文件夹和打印文件名的顺序错误,python,python-3.x,zipfile,Python,Python 3.x,Zipfile,请帮助尝试打印图片的文件名。我要么打印相同的文件名,要么打印具有不同文件名的相同图片 我希望输出是FileName,然后是与FileName关联的Pic。 相反,我得到的是FileName0和Pic0然后是FileName0然后是Pic1 或者Filename0然后Pic0然后Filename1然后Pic0 我在原来的帖子中添加了更多的代码,以澄清我试图做的事情。希望我/它有意义。我想打印图像的名称,然后显示图像。我使用的新代码显示图像,然后在其底部打印名称(无),然后程序终止。假设列表中有4个

请帮助尝试打印图片的文件名。我要么打印相同的文件名,要么打印具有不同文件名的相同图片

我希望输出是
FileName
,然后是与
FileName
关联的
Pic
。 相反,我得到的是
FileName0
Pic0
然后是
FileName0
然后是
Pic1
或者
Filename0
然后
Pic0
然后
Filename1
然后
Pic0

我在原来的帖子中添加了更多的代码,以澄清我试图做的事情。希望我/它有意义。我想打印图像的名称,然后显示图像。我使用的新代码显示图像,然后在其底部打印名称(无),然后程序终止。假设列表中有4个图像。我想在图像[0]处打印名称,然后在循环中显示图像[0],然后打印图像[1]显示图像[1]

#OLD CODE
with zipfile.ZipFile("file.zip", 'r') as zip_ref:
    zip_ref.extractall("folderName")

    for info in zip_ref.infolist():
        for file in os.listdir("folderName"):
            image=Image.open(file).convert('RGB') 

            print(info.filename)
            display(image)

#NEW CODE
#My current list length is 4
file_name = []
actual_image = []
##Extract all the files and put in folder
with zipfile.ZipFile("readonly/small_img.zip", 'r') as zip_ref:
    zip_ref.extractall("pyproject")

#Add name to list/Add image to list.  Probably should be one list.
for entry in os.scandir("pyproject"):
    file_name.append(entry.name)
for file in os.listdir("pyproject"):
    image=Image.open(file).convert('RGB')
    actual_image.append(image)
#print(info.filename,display(image)) 

#Newer line of code directly above.  
#When the above for loop becomes nested it displays 4 
#pictures with the file number underneath.  Expected result is 1pic to 1 filename.  
#Its closer to what I want.  Will keep trying.

print(len(file_name))

#Returns file names.
def name_of_file(a):
    for names in a:
        return names

#Returns image to be displayed
def image_of_file(b):
    for image in b:
        return (display(image))
##Prints out image name and then displays image
print(name_of_file(file_name),image_of_file(actual_image))

###Dictionary example code:
list_of_pictures = [{image1_of_four :PIL.image,bounding_box,pytesseract_text}]

我认为这种混乱来自双重迭代。就我所见,这是没有必要的,因为您只想迭代压缩目录中的每个(图像)文件。(如果我理解正确的话。)

在这里,一次迭代就足够了:

导入zipfile
zipfile.zipfile(“file.zip”,“r”)作为zip\u参考:
对于zip_ref.filelist中的文件:
打印(文件名)
# ...
因此,要处理zip归档文件中的文件,您可以执行以下操作(当然,根据使用情况,有几种可能性):

导入zipfile
从PIL导入图像,未识别图像错误
zipfile.zipfile(“file.zip”,“r”)作为zip\u参考:
对于zip_ref.filelist中的zip_文件:
打印(f“这是您的文件信息:{zipped_file.filename}”)
尝试:
file=zip\u ref.open(压缩文件)
image=image.open(file.convert('RGB'))
除未识别的图像错误外:
打印(f“错误处理{zipped_file.filename}”)
如果您确实需要来自迭代(压缩)文件的更多信息,那么该方法就可以了,它提供了来自-object的信息

问题编辑后更新

据我所知,还有一张图片要显示,还有相应的文件名要打印。如果我的假设是正确的,那么所提供的代码有几个问题:

  • 根本不需要多次迭代。无论是一行中有一个嵌套迭代还是多个迭代。限制迭代次数也会降低复杂性,而且整个过程可能会变得不那么复杂。详细说明:使用多个迭代来实现1。解压文件(
    zip\u ref.extractall()
    已经在迭代),2。将文件名存储在列表中,3。将图像对象存储在列表4中。打印存储的文件名,5。显示图像对象。在对存档中的文件进行迭代时,所有信息都已可用,或者可以在当前迭代步骤中轻松计算。这完全消除了为文件名、图像对象等创建多个数据结构的需要。在这里,您已经有了文件,因此也有了文件名和相应的图像
  • 我仍然觉得没有理由先把整个档案打开。所有这些都可以在迭代本身中完成。如果要保存图像本身,那么解包当然很有用。但是,您也可以简单地解压文件,然后使用Python迭代解压后的文件,例如使用
    os.scandir()
    。这是在更新的代码中实现的。但是,如果您只想显示每个迭代步骤的当前文件,则不需要这样做
不幸的是,
display()
的功能我还不知道。可能在那里也做了类似的事情。在问题中的代码更新之后,我只能对我的示例进行一些小的更改,以显示显示相应图像的文件名是多么容易:

导入操作系统
进口拉链
从PIL导入图像,未识别图像错误
zipfile.zipfile(“file.zip”,“r”)作为zip\u参考:
对于zip_ref.filelist中的zip_文件:
尝试:
image=image.open(zip\u ref.open(zip\u文件)).convert('RGB'))
打印(os.path.basename(压缩文件名))
image.show()#模拟:显示(图像)
输入(“按键显示下一幅图像…”)
除未识别的图像错误外:
通过
我只打印文件名,其中还有一张匹配的图片。没有其他打印(以保持尽可能清晰)
image.show()
用于模拟未知的
display(image)
-功能。为了明确相应的文件名是指当前打开的图像,我在这里以用户提示(
input()
)的形式包含了一个暂停

所有这一切都是基于这样的假设,即只需显示特定图像的适当文件名。在这里,只使用一次迭代应该是合适的解决方案

使用多次迭代将对象存储在多个列表中(如问题中所述)会导致一个缺点:更高的复杂性。在这种情况下,列表的索引位置必须相互匹配,当迭代一个列表时,您必须访问具有相同索引位置的另一个列表,如下所示:

list_a=[1,2,3]
列表b=[“a”、“b”、“c”]
对于索引,枚举中的el(列表a):
打印(el,列表b[索引])
您必须在不更改大部分代码的情况下执行此操作。但是,您必须确保列表永远不会更改(或者更确切地说,使用元组),这更复杂(也更复杂)。另请参见。

先生,这回答了我的问题。非常感谢。我进一步阅读了我正在做的项目,并将把信息添加到字典列表中。我将举上面的例子。B