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)
我正在尝试打开一个 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)