如何使用 glob 查找名称为 1 但不是 10 的文件
How to use glob to find file with name 1 but not 10
我有标记为 file1、file2、file3...的文件,但是对于每个文件,还有名为 file1_1、file2_1、file2_2 的附加文件。 ..
现在,我想按相应顺序遍历所有文件,因此 file1,file1_1,file2,file2_1,...
import glob
for iter in range(number_of_files):
find_matching_files = glob.glob(file_directory + '\file' + str(iter+1) + "*")
问题是现在 file1 和 file10 是按连续顺序列出的。如果我擦除“*”,则排除其他文件。有什么聪明的方法可以做到这一点吗?
您可以使用正则表达式提取文件名的所有数字部分。然后使用 Python 的 lexicographical ordering 序列,我们可以轻松地将一个文件的编号与另一个文件的编号进行比较,使得 file1_1 [1, 1]
小于 file1_2 [1, 2]
又小于 file10_1 [10, 1]
又小于 file10_1_1 [10, 1, 1]
.
import re
files = ["file1", "file2", "file1_1", "file1_2_2", "file10_2", "file10", "file2_3_1", "file2_1", "file1_2", "file2_3", "file1_2_1", "file2_2"]
files_sorted = sorted(files, key=lambda value: tuple(map(int, re.findall(r"\d+", value))))
print(files_sorted)
输出:
['file1', 'file1_1', 'file1_2', 'file1_2_1', 'file1_2_2', 'file2', 'file2_1', 'file2_2', 'file2_3', 'file2_3_1', 'file10', 'file10_2']
您可以尝试将排除 !
与范围匹配 []
结合使用,如下所示:
import glob
for iter in range(number_of_files):
find_matching_files = glob.glob(file_directory + '\file' + str(iter+1) + '[!0-9]' + "*")
但是find_matching_files
每次循环匹配的文件顺序是not guaranteed,所以你可能需要在每次匹配后自己排序。
我有标记为 file1、file2、file3...的文件,但是对于每个文件,还有名为 file1_1、file2_1、file2_2 的附加文件。 ..
现在,我想按相应顺序遍历所有文件,因此 file1,file1_1,file2,file2_1,...
import glob
for iter in range(number_of_files):
find_matching_files = glob.glob(file_directory + '\file' + str(iter+1) + "*")
问题是现在 file1 和 file10 是按连续顺序列出的。如果我擦除“*”,则排除其他文件。有什么聪明的方法可以做到这一点吗?
您可以使用正则表达式提取文件名的所有数字部分。然后使用 Python 的 lexicographical ordering 序列,我们可以轻松地将一个文件的编号与另一个文件的编号进行比较,使得 file1_1 [1, 1]
小于 file1_2 [1, 2]
又小于 file10_1 [10, 1]
又小于 file10_1_1 [10, 1, 1]
.
import re
files = ["file1", "file2", "file1_1", "file1_2_2", "file10_2", "file10", "file2_3_1", "file2_1", "file1_2", "file2_3", "file1_2_1", "file2_2"]
files_sorted = sorted(files, key=lambda value: tuple(map(int, re.findall(r"\d+", value))))
print(files_sorted)
输出:
['file1', 'file1_1', 'file1_2', 'file1_2_1', 'file1_2_2', 'file2', 'file2_1', 'file2_2', 'file2_3', 'file2_3_1', 'file10', 'file10_2']
您可以尝试将排除 !
与范围匹配 []
结合使用,如下所示:
import glob
for iter in range(number_of_files):
find_matching_files = glob.glob(file_directory + '\file' + str(iter+1) + '[!0-9]' + "*")
但是find_matching_files
每次循环匹配的文件顺序是not guaranteed,所以你可能需要在每次匹配后自己排序。