通过增加计数器重命名重复的 pdf 名称
Rename duplicate pdf name by increasing counter
所以我写了一些东西来从 pdf 中提取某些字符串(受益人)并根据字符串重命名文件,但问题是如果有重复项,有没有办法在后面添加一个 +1 计数器姓名?
我的低效代码如下,感谢您的帮助!:
for filename in os.listdir(input_dir):
if filename.endswith('.pdf'):
input_path = os.path.join(input_dir, filename)
pdf_array = (glob.glob(input_dir + '*.pdf'))
for current_pdf in pdf_array:
with pdfplumber.open(current_pdf) as pdf:
page = pdf.pages[0]
text = page.extract_text()
keyword = text.split('\n')[2]
try:
if 'attention' in keyword:
pdf_to_att = text.split('\n')[2]
start_to_att = 'For the attention of: '
to_att = pdf_to_att.removeprefix(start_to_att)
pdf.close()
result = to_att
os.rename(current_pdf, result + '.pdf')
else:
pdf_to_ben = text.split('\n')[1]
start_to_ben = 'Beneficiary Name : '
end_to_ben = pdf_to_ben.rsplit(' ', 1)[1]
to_ben = pdf_to_ben.removeprefix(start_to_ben).removesuffix(end_to_ben).rstrip()
pdf.close()
result = to_ben
os.rename(current_pdf, result + '.pdf')
except Exception:
pass
messagebox.showinfo("A Title", "Done!")
编辑:所需的输出应该是
AAA.pdf
AAA_2.pdf
BBB.pdf
CCC.pdf
CCC_2.pdf
你想要的是为文件名构建一个字符串,其中包括一个计数器,
我们称它为 cnt
。 Python 具有用于此确切目的的 f 字符串语法,它
允许您将变量插入字符串。
在 for
循环之前初始化您的计数器:
cnt = 0
替换
os.rename(current_pdf, result + '.pdf')
和
os.rename(current_pdf, f'{result}_{cnt}.pdf')
cnt += 1
开引号前的f
引入了f-string,和大括号
{}
让你包含任何 python 表达式,在你的情况下我们只是替换
result
和 cnt
这两个变量的值。然后我们增加计数器,
当然。
os.path.isfile
可以成为满足您需求的伴侣。
import os
def get_new_name(result):
file_name = result + '{}.pdf'
file_number = 0
if os.path.isfile(file_name.format('')): # AAA.pdf
file_number = 2
while os.path.isfile(file_name.format('_{}'.format(file_number))):
file_number += 1
if file_number:
pdf_name = file_name.format('_{}'.format(file_number))
else:
pdf_name = file_name.format('')
return pdf_name
my screenshot
我为你的输出格式更新了代码,它可以工作。
我会用字典来记录每个文件名出现的次数。
dict.get()
returns 如果 key 在字典中,则 key 的值,否则 默认。如果没有给出default,则默认为None
pdf_name_count = {}
for current_pdf in pdf_array:
with pdfplumber.open(current_pdf) as pdf:
page = pdf.pages[0]
text = page.extract_text()
keyword = text.split('\n')[2]
try:
if 'attention' in keyword:
...
result = to_att
else:
...
result = to_ben
filename_count = pdf_name_count.get(result, 0)
if filename_count >= 1:
filename = f'{result}_{filename_count+1}.pdf'
else:
filename = result + '.pdf'
os.rename(current_pdf, filename)
# increase the name occurrence by 1
pdf_name_count[result] = filename_count + 1
except Exception:
pass
所以我写了一些东西来从 pdf 中提取某些字符串(受益人)并根据字符串重命名文件,但问题是如果有重复项,有没有办法在后面添加一个 +1 计数器姓名?
我的低效代码如下,感谢您的帮助!:
for filename in os.listdir(input_dir):
if filename.endswith('.pdf'):
input_path = os.path.join(input_dir, filename)
pdf_array = (glob.glob(input_dir + '*.pdf'))
for current_pdf in pdf_array:
with pdfplumber.open(current_pdf) as pdf:
page = pdf.pages[0]
text = page.extract_text()
keyword = text.split('\n')[2]
try:
if 'attention' in keyword:
pdf_to_att = text.split('\n')[2]
start_to_att = 'For the attention of: '
to_att = pdf_to_att.removeprefix(start_to_att)
pdf.close()
result = to_att
os.rename(current_pdf, result + '.pdf')
else:
pdf_to_ben = text.split('\n')[1]
start_to_ben = 'Beneficiary Name : '
end_to_ben = pdf_to_ben.rsplit(' ', 1)[1]
to_ben = pdf_to_ben.removeprefix(start_to_ben).removesuffix(end_to_ben).rstrip()
pdf.close()
result = to_ben
os.rename(current_pdf, result + '.pdf')
except Exception:
pass
messagebox.showinfo("A Title", "Done!")
编辑:所需的输出应该是
AAA.pdf
AAA_2.pdf
BBB.pdf
CCC.pdf
CCC_2.pdf
你想要的是为文件名构建一个字符串,其中包括一个计数器,
我们称它为 cnt
。 Python 具有用于此确切目的的 f 字符串语法,它
允许您将变量插入字符串。
在 for
循环之前初始化您的计数器:
cnt = 0
替换
os.rename(current_pdf, result + '.pdf')
和
os.rename(current_pdf, f'{result}_{cnt}.pdf')
cnt += 1
开引号前的f
引入了f-string,和大括号
{}
让你包含任何 python 表达式,在你的情况下我们只是替换
result
和 cnt
这两个变量的值。然后我们增加计数器,
当然。
os.path.isfile
可以成为满足您需求的伴侣。
import os
def get_new_name(result):
file_name = result + '{}.pdf'
file_number = 0
if os.path.isfile(file_name.format('')): # AAA.pdf
file_number = 2
while os.path.isfile(file_name.format('_{}'.format(file_number))):
file_number += 1
if file_number:
pdf_name = file_name.format('_{}'.format(file_number))
else:
pdf_name = file_name.format('')
return pdf_name
my screenshot
我为你的输出格式更新了代码,它可以工作。
我会用字典来记录每个文件名出现的次数。
dict.get()
returns 如果 key 在字典中,则 key 的值,否则 默认。如果没有给出default,则默认为None
pdf_name_count = {}
for current_pdf in pdf_array:
with pdfplumber.open(current_pdf) as pdf:
page = pdf.pages[0]
text = page.extract_text()
keyword = text.split('\n')[2]
try:
if 'attention' in keyword:
...
result = to_att
else:
...
result = to_ben
filename_count = pdf_name_count.get(result, 0)
if filename_count >= 1:
filename = f'{result}_{filename_count+1}.pdf'
else:
filename = result + '.pdf'
os.rename(current_pdf, filename)
# increase the name occurrence by 1
pdf_name_count[result] = filename_count + 1
except Exception:
pass