使用特定条件批量重命名文件名

时间:2019-05-04 06:17:26

标签: python python-3.x

我想使用特定条件对文件夹中的一组文件进行批处理重命名,即(添加前缀,从特定编号开始,并以+1系列递增,跳过系列中的特定编号,添加具有相同编号的文件使用下划线)

我有一组扫描的文档文件,从指定的数字(例如10)开始,以1递增。例如10、11、12,...

。但是某些文件将丢失,例如13丢失,因此需要一个选项来跳过13并以14开头。另外一些文件将是2页,因此需要在下划线处加以区分。前15个文件为2页,因此第二个文件需要放置15_2。

UPDATE1:我已经修复了几乎所有内容,现在可以正常工作,但是现在我需要做两件事 1.需要一个while循环,以检查输入的跳过数字是否小于或等于x。

  1. 我不知道如何执行以下条件:

还有一些文件将是2页,因此需要在下划线处加以区分。前15个文件为2页,因此第二个文件需要放置15_2。

更新2:我添加了重复文件存在的条件,但语法错误如下 更新3:我的朋友帮助我摆脱了语法错误。

更新4:我的朋友提供了一些逻辑上的帮助,我已经解决了这个难题,此处更新以供参考。谢谢Jishnu

line 20
i -= 1 and dst = pre.upper() + str(i) + "_2.pdf"
import os

pre = str(input("Enter prefix : "))

while pre not in ("cin", "CIN", "CRT", "crt", "inv", "INV", "DO", "do"):
    pre = str(input("Please check the entered prefix and try again : "))

x = int(input("Enter first no : "))
skip = int(input("Skip : "))
rt = int(input("Enter repeating number"))
rt = rt + 1
def main():
    i = x


    for filename in os.listdir("C:/Users/Ajeshhome/Desktop/scan/"):
        if skip == i:
            i += 1
            dst = pre.upper() + str(i) + ".pdf"
            src = 'C:/Users/Ajeshhome/Desktop/scan/' + filename
            dst = 'C:/Users/Ajeshhome/Desktop/scan/' + dst
            os.rename(src, dst)
            i += 1

        elif rt == i:
            dst = pre.upper() + str(i-1) + "_2.pdf"
            src = 'C:/Users/Ajeshhome/Desktop/scan/' + filename
            dst = 'C:/Users/Ajeshhome/Desktop/scan/' + dst
            os.rename(src, dst)
            i += 1
        else:
            dst = pre.upper() + str(i) + ".pdf"
            src = 'C:/Users/Ajeshhome/Desktop/scan/' + filename
            dst = 'C:/Users/Ajeshhome/Desktop/scan/' + dst
            os.rename(src, dst)
            i += 1

def lis():

        path = 'C:/Users/Ajeshhome/Desktop/scan/'

        files = []
        # r=root, d=directories, f = files
        for r, d, f in os.walk(path):
            for file in f:
                if '.pdf' in file:
                    files.append(os.path.join(r, file))

        for f in files:
            print(f)






# Driver Code
if __name__ == '__main__':
    # Calling main() function
    main()
    lis()
    os.system('pause')



1 个答案:

答案 0 :(得分:0)

我不确定如何解决您所询问的所有问题。但这是一个开始:可靠的前缀选择。这是整个代码:

PREFIXES = {
    "CIN",
    "CRT",
    "DO",
    "INV",
}

def ask_prefix():
    prefixes = sorted(PREFIXES)
    for i, prefix in enumerate(prefixes, start=1):
        print(f'{i}) {prefix}')
    while True:
        reply = input('Select prefix: ').strip().upper()
        try:
            index = int(reply) - 1
        except ValueError:
            if reply in PREFIXES:
                return reply
        else:
            if 0 <= index < len(prefixes):
                return prefixes[index]
        print(f'{reply!r} is not a valid prefix.')

pre = ask_prefix()

所有有效前缀的全局集:

PREFIXES = {
    "CIN",
    "CRT",
    "DO",
    "INV",
}

现在让我们看一下ask_prefix()。第一行从PREFIXES创建一个排序列表,因此它们以良好的顺序打印出来。然后:

for i, prefix in enumerate(prefixes, start=1):
    print(f'{i}) {prefix}')

使用enumerate为前缀编号,然后打印出数字和前缀以创建菜单。接下来,输入一个无限循环(while True:),该循环仅在用户输入或选择有效前缀时才会中断。

从菜单中向用户询问前缀或数字,然后清理输入:

reply = input('Select prefix: ').strip().upper()

尝试将回复作为索引:

try:
    index = int(reply) - 1
except ValueError:
    ...
else:
    if 0 <= index < len(prefixes):
        return prefixes[index]

如果它不能用作索引,请尝试将其作为前缀:

if reply in PREFIXES:
    return reply