我最近开始使用Python,我很难根据我创建的正则表达式搜索目录和匹配文件。基本上我希望它扫描另一个目录中的所有目录,找到以.zip或.rar或.r01结尾的所有文件,然后根据它的文件运行各种命令。
import os, re
rootdir = "/mnt/externa/Torrents/completed"
for subdir, dirs, files in os.walk(rootdir):
if re.search('(w?.zip)|(w?.rar)|(w?.r01)', files):
print "match: " . files
答案 0 :(得分:5)
import os
import re
rootdir = "/mnt/externa/Torrents/completed"
regex = re.compile('(.*zip$)|(.*rar$)|(.*r01$)')
for root, dirs, files in os.walk(rootdir):
for file in files:
if regex.match(file):
print(file)
以下评论中的CODE BELLOW ANSWERS问题
这非常有效,如果在regex group 1上找到匹配,有没有办法做到这一点,如果在regex group 2上找到匹配,那么这样做吗? - nillenilsson
import os
import re
regex = re.compile('(.*zip$)|(.*rar$)|(.*r01$)')
rx = '(.*zip$)|(.*rar$)|(.*r01$)'
for root, dirs, files in os.walk("../Documents"):
for file in files:
res = re.match(rx, file)
if res:
if res.group(1):
print("ZIP",file)
if res.group(2):
print("RAR",file)
if res.group(3):
print("R01",file)
有可能以更好的方式做到这一点,但这是有效的。
答案 1 :(得分:5)
鉴于您是一个初学者,我建议使用glob
代替快速编写的file-walking-regex匹配器。
glob
和file-walking-regex matcher
的功能片段下面的代码段包含两个文件正则表达式搜索功能(一个使用glob
,另一个使用自定义文件遍历-正则表达式匹配器)。该代码段还包含一个“秒表”功能,用于对这两个功能进行计时。
import os
import sys
from datetime import timedelta
from timeit import time
import os
import re
import glob
def stopwatch(method):
def timed(*args, **kw):
ts = time.perf_counter()
result = method(*args, **kw)
te = time.perf_counter()
duration = timedelta(seconds=te - ts)
print(f"{method.__name__}: {duration}")
return result
return timed
@stopwatch
def get_filepaths_with_oswalk(root_path: str, file_regex: str):
files_paths = []
pattern = re.compile(file_regex)
for root, directories, files in os.walk(root_path):
for file in files:
if pattern.match(file):
files_paths.append(os.path.join(root, file))
return files_paths
@stopwatch
def get_filepaths_with_glob(root_path: str, file_regex: str):
return glob.glob(os.path.join(root_path, file_regex))
使用上述两个函数在名为filename_*.csv
的目录中找到5076个与正则表达式root_path
匹配的文件(包含66,948个文件):
>>> glob_files = get_filepaths_with_glob(root_path, 'filename_*.csv')
get_filepaths_with_glob: 0:00:00.176400
>>> oswalk_files = get_filepaths_with_oswalk(root_path,'filename_(.*).csv')
get_filepaths_with_oswalk: 0:03:29.385379
glob
方法更快,并且代码更短。
对于您的情况,您可能可以使用以下类似的方法来获取*.zip
,*.rar
和*.r01
文件:
files = []
for ext in ['*.zip', '*.rar', '*.r01']:
files += get_filepaths_with_glob(root_path, ext)
答案 2 :(得分:3)
这是使用glob
的替代方法。
from pathlib import Path
rootdir = "/mnt/externa/Torrents/completed"
for extension in 'zip rar r01'.split():
for path in Path(rootdir).glob('*.' + extension):
print("match: " + path)
答案 3 :(得分:0)
我会这样:
import re
from pathlib import Path
def glob_re(path, regex="", glob_mask="**/*", inverse=False):
p = Path(path)
if inverse:
res = [str(f) for f in p.glob(glob_mask) if not re.search(regex, str(f))]
else:
res = [str(f) for f in p.glob(glob_mask) if re.search(regex, str(f))]
return res
注意:默认情况下,它将递归扫描所有子目录。如果只想扫描当前目录,则应显式指定glob_mask="*"