我最近在脚本中发现了一个巨大的错误,我需要一些帮助来解决它。
这个脚本在我们的代码库中搜索多个子目录,找到符合特定条件的所有源文件,并列出名称。我称此列表为:all_files
然后它运行另一个程序,这个程序生成新的源文件(接近相同的名称(,这些文件被放置在另一个目录中。我进入那个目录,列出里面的文件名。我称此列表为:covered_files
现在的问题是,新的源文件名的不同之处在于它们有前导词。例如:
-->all_files
中的文件名:fileName.cpp
-->covered_files
中的文件名:prefix_fileName.cpp
这两个文件相互对应,这个脚本的任务是返回all_files
中显示在covered_files
中的名称列表。。。也就是说,在上面的例子中;fileName.cpp";将被添加到列表中,因为它在两者中。
一个主要问题是存在对应于";fileName1.cpp";,fileName2.cpp";,等等。正如你将在我下面的代码中看到的,它只解释了其中一个文件,当它们都需要的时候。
我目前拥有的:
def find_covered_files(all_files):
covered_path = <path to the newly generated files>
# Make a list of every file in the covered folder
covered_files = [f for f in listdir(covered_path) if isfile(join(covered_path, f))]
file_match_list = []
# Seach through the covered files for matches
for cov_file in covered_files:
# Find the file matches
for files in all_files:
if files in cov_file:
file_match_list.append(files)
return file_match_list
因此,总的来说,我的问题是:有没有一种方法可以在两个列表中搜索,其中一个条目是另一个条目的子字符串,无论该子字符串是否出现多次,都可以为我提供所涵盖的每个文件名?提前感谢您的帮助!
编辑:另一个使用一些实际文件名的例子:
有文件Segment.cpp
、SegmentAllocation.cpp
和SegmentImpl.cpp
。它们将在all_files
列表中,并且在covered_files
列表中具有匹配的前缀名称。
在代码运行之后,我希望它们三个都在file_match_list
中。但是,只有第一个文件名在其中重复了3次。
因此,代替:(所需(
['Segment.cpp', 'SegmentAllocation.cpp', 'SegmentImpl.cpp']
我得到:
['Segment.cpp', 'Segment.cpp', 'Segment.cpp']
我在调试后回答了这个问题,我需要在for循环中使用一个break语句:
def find_covered_files(all_files(:
covered_path = <path to the newly generated files>
# Make a list of every file in the covered folder
covered_files = [f for f in listdir(covered_path) if isfile(join(covered_path, f))]
file_match_list = []
# Seach through the covered files for matches
for cov_file in covered_files:
# Find the file matches
for files in all_files:
if files in cov_file:
file_match_list.append(files)
break
return file_match_list