python 通过 shutil 根据正则表达式模式复制文件
python copy files based on regex pattern via shutil
我是 Whosebug 和编程方面的新手,我正试图在办公室解决一个相当耗时的问题。我们想根据文件名将文件复制到不同的位置或将它们添加到 .zip 文件中。
文件名看起来像这样 16410_REC-7372-20201102161426.PDF.
重要的部分是:
- 我们只需要 select 包含前缀 'REC'
的文件
- 以下4位是需要用户输入的所需文档的数值范围
- 最后,需要将落在数字范围内的文件复制到新的目的地或添加到 .zip 文件
到目前为止我唯一能做的就是根据文件结尾将文件复制到另一个位置。根据我的阅读,这可以用正则表达式(我认为我可以构造的字符串)来完成,但我不知道如何在 python.
中实现 selection
目前的代码如下:
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
之前。)
我是 Whosebug 和编程方面的新手,我正试图在办公室解决一个相当耗时的问题。我们想根据文件名将文件复制到不同的位置或将它们添加到 .zip 文件中。
文件名看起来像这样 16410_REC-7372-20201102161426.PDF.
重要的部分是:
- 我们只需要 select 包含前缀 'REC' 的文件
- 以下4位是需要用户输入的所需文档的数值范围
- 最后,需要将落在数字范围内的文件复制到新的目的地或添加到 .zip 文件
到目前为止我唯一能做的就是根据文件结尾将文件复制到另一个位置。根据我的阅读,这可以用正则表达式(我认为我可以构造的字符串)来完成,但我不知道如何在 python.
中实现 selection目前的代码如下:
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
之前。)