python - python通过shutil基于正则表达式模式复制文件
问题描述
我是 stackoverflow 和编程的新手,我正在尝试解决办公室中一个相当耗时的问题。我们想根据文件名将文件复制到不同的位置或将它们添加到 .zip 文件中。
文件名类似于 16410_REC- 7372 -20201102161426.PDF。
重要的部分是:
- 我们只需要选择包含前缀“REC”的文件
- 以下 4 位数字是需要由用户输入指定的所需文档的数字范围
- 最后,需要将数字范围内的文件复制到新目标或添加到 .zip 文件中
到目前为止,我唯一要做的就是将基于文件结尾的文件复制到另一个位置。从我读过的内容来看,这可以用正则表达式(我认为我可以构造的字符串)来完成,但我错过了如何在 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)
我希望有人能指出我正确的方向或帮助我编写代码?
干杯,马库斯
解决方案
要查找静态模式,您实际上并不需要正则表达式。
顺便说一句,我会将您的脚本更改为简单地查看当前目录;那么就可以很容易地对一组您想要测试的文件进行测试,而无需尝试真实的生产位置。
# 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
。)
推荐阅读
- testing - grabAttributeFrom() 方法不返回属性值
- ffmpeg - ffmpeg -f sdl 通过 UDP 与 ffmpeg -f h264 进行比较
- karate - 空手道登录功能的参数化
- node.js - Sequelize 抛出贬值警告
- docker - Docker Hub 登录失败,状态为 404 Not Found
- jmeter - JMETER Beanshell 读取文件 - 不工作 - 找不到错误命令:newBufferedReader(java.io.FileReader)
- reactjs - 什么是 React 应用程序的运行时环境以及什么是 React 应用程序中的请求-响应流程
- laravel - 无法创建根目录 - 用 laravel 大摇大摆
- c++ - 为什么我的代码在运行时停留在循环中
- java - Springboot-Prometheus:仅当来自特定来源时才增加 http_server_requests_seconds_count 计数器