Python pathlib:如何从具有表达式匹配的路径中过滤文件?
Python pathlib: How to filter files from path with expression matching?
我想过滤掉目录中包含特定表达式的文件。我对 Python 很陌生。在 R 中,我会使用字符串,但在 Python 中,我使用 pathlib
,它具有一些巧妙的优点,例如跨平台兼容性。
例如,我有一个由 WindowsPath
个要过滤的对象组成的列表:
from pathlib import Path
import re, glob
fileDir = Path(r'T:\testdir')
filelist = [img for img in fileDir.iterdir() if img.is_file()]
print(filelist)
[WindowsPath('T:/testdir/T31TGL_20180108T104421_B11.jp2'), WindowsPath('T:/testdir/T31TGL_20180108T104421_B12.jp2'), WindowsPath('T:/testdir/T31TGL_20180108T104421_TCI.jp2')]
所需的输出是文件 T31TGL_20180108T104421_TCI.jp2
的路径。例如。我想为表达式 TCI
过滤 filelist
中包含的文件。
我尝试使用表达式匹配进行过滤,如下所示:
expr = re.compile('.*TCI')
TCI_path = list(filter(expr.match, imglist))
这会引发错误:
TypeError: expected string or bytes-like object
例如不适用于 filelist
的 WindowsPath 对象。我也尝试过 .glob
方法 (https://docs.python.org/3.5/library/glob.html#glob.glob) 但我对 python 太缺乏经验,似乎无法让它工作...
如何相应地过滤此列表?
您可以在匹配之前将您的 WindowsPath
转换为 str
:
TCI_path = list(item for item in filelist if expr.match(str(item)))
.glob("*TCI*")
(或者甚至 .glob("*_TCI.jp2")
)也应该有效...
我想过滤掉目录中包含特定表达式的文件。我对 Python 很陌生。在 R 中,我会使用字符串,但在 Python 中,我使用 pathlib
,它具有一些巧妙的优点,例如跨平台兼容性。
例如,我有一个由 WindowsPath
个要过滤的对象组成的列表:
from pathlib import Path
import re, glob
fileDir = Path(r'T:\testdir')
filelist = [img for img in fileDir.iterdir() if img.is_file()]
print(filelist)
[WindowsPath('T:/testdir/T31TGL_20180108T104421_B11.jp2'), WindowsPath('T:/testdir/T31TGL_20180108T104421_B12.jp2'), WindowsPath('T:/testdir/T31TGL_20180108T104421_TCI.jp2')]
所需的输出是文件 T31TGL_20180108T104421_TCI.jp2
的路径。例如。我想为表达式 TCI
过滤 filelist
中包含的文件。
我尝试使用表达式匹配进行过滤,如下所示:
expr = re.compile('.*TCI')
TCI_path = list(filter(expr.match, imglist))
这会引发错误:
TypeError: expected string or bytes-like object
例如不适用于 filelist
的 WindowsPath 对象。我也尝试过 .glob
方法 (https://docs.python.org/3.5/library/glob.html#glob.glob) 但我对 python 太缺乏经验,似乎无法让它工作...
如何相应地过滤此列表?
您可以在匹配之前将您的 WindowsPath
转换为 str
:
TCI_path = list(item for item in filelist if expr.match(str(item)))
.glob("*TCI*")
(或者甚至 .glob("*_TCI.jp2")
)也应该有效...