首页 > 解决方案 > python通过shutil基于正则表达式模式复制文件

问题描述

我是 stackoverflow 和编程的新手,我正在尝试解决办公室中一个相当耗时的问题。我们想根据文件名将文件复制到不同的位置或将它们添加到 .zip 文件中。

文件名类似于 16410_REC- 7372 -20201102161426.PDF。

重要的部分是:

到目前为止,我唯一要做的就是将基于文件结尾的文件复制到另一个位置。从我读过的内容来看,这可以用正则表达式(我认为我可以构造的字符串)来完成,但我错过了如何在 python 中实现选择。

这是到目前为止的代码:

from os.path import isfile
import os
import shutil

source = os.listdir("n:/DIESTEIN/DSCS/Dokumente/")
destination = "n:/Test/"

print('select starting number: ')
f_start = input()

print('select ending number: ')
f_end = input()

for files in source:
    if files.endswith(".txt"):
        shutil.copy(files, destination)

我希望有人能指出我正确的方向或帮助我编写代码?

干杯,马库斯

标签: pythonregexshutil

解决方案


要查找静态模式,您实际上并不需要正则表达式。

顺便说一句,我会将您的脚本更改为简单地查看当前目录;那么就可以很容易地对一组您想要测试的文件进行测试,而无需尝试真实的生产位置。

# from os.path import isfile  <- unused, comment out
import os
import shutil

destination = "n:/Test/"

f_start = int(input('select starting number: '))
f_end = int(input('select ending number: '))

for file in os.listdir("."):
    if "_REC-" in file and f_start <= int(file.split("-")[1]) <= f_end:
        shutil.copy(file, destination)

如果您真的想使用正则表达式,也许类似于

import re

pattern = re.compile(r"\d+_REC-(\d+)-\d+\.PDF")
...
    matching = pattern.match(file)
    if matching and f_start <= int(matching.group(1)) <= f_end:

正则表达式对文件名是否与预期模式匹配进行了更严格的检查(当然我必须猜测您的期望是什么)。如果您的文件包含_REC-但不遵守该模式,那么正则表达式可能会很有用。但是对于简单的需求,如果您只选择足够的文件名以提取您需要的部分,则更容易查看代码的作用,然后您不必学习阅读正则表达式。(例如,如果不够严格,也许还要检查文件名是否以数字开头并以.PDF?结尾)

还要注意我们需要如何将包含数字的字符串转换int为以执行数字比较。(如果你忘记了,"123"看起来会比"22"因为按字母顺序1出现在前面2。)


推荐阅读