Python: For 循环只迭代一次 - 也使用 with 语句

Python: For loop only iterates once - also using a with statement

我正在尝试打开一个 zip 文件并遍历 zip 文件中的 PDF。我想抓取 pdf 中文本的特定部分。我正在使用以下代码:

def get_text(part):
    #Create path
    path = f'C:\Users\user\Data\Part_{part}.zip'
    
    with zipfile.ZipFile(path) as data:
        listdata = data.namelist()
        onlypdfs = [k for k in listdata if '_2018' in k or '_2019' in k or '_2020' in k or '_2021' in k or '_2022' in k]

        for file in onlypdfs:
            with data.open(file, "r") as f:
                #Get the pdf
                pdffile = pdftotext.PDF(f)
                text = ("\n\n".join(pdffile))

    
                #Remove the newline characters
                text = text.replace('\r\n', ' ')
                text = text.replace('\r', ' ')
                text = text.replace('\n', ' ')
                text = text.replace('\x0c', ' ')

                #Get the text that will talk about what I want
                try:
                    text2 = re.findall(r'FEES (.+?) Types', text, re.IGNORECASE)[-1]

                except:
                    text2 = 'PROBLEM'

                #Return the file name and the text
                return file, text2

那么下一行我是运行:

info = []
for i in range(1,2):
    info.append(get_text(i))
info

我的输出只是第一个文件和文本。我在 zip 文件夹中有 4 个 PDF。理想情况下,我希望它遍历 30 多个 zip 文件。但是我只有一个遇到了麻烦。 我以前看过这个问题,但解决方案不适合我的问题。与 with 语句有关吗?

当您在此行使用 return 语句时:return file, text2,您退出 for 循环,跳过您想要阅读的其他 pdf。

解决方案是将 return 语句移到 for 循环之外。

您需要处理所有文件并在迭代时存储每个文件。如何执行此操作的一个示例是将它们存储在元组列表中:

file_list = []
for file in onlypdfs:
    ...
    file_list.append((file, text2)
return file_list

然后您可以像这样使用它:

info = []
for i in range(1,2):
    list = get_text(i)
    for file_text in list:
        info.append(file_text)
print(info)