通过增加计数器重命名重复的 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 表达式,在你的情况下我们只是替换 resultcnt 这两个变量的值。然后我们增加计数器, 当然。

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