查找两个文件之间的子字符串匹配

时间:2019-07-19 01:29:53

标签: python string list file match

我有一个电影标题列表和一个名称列表。

电影:

  • 独立日
  • 谁陷害了Roger Rabbit
  • 罗斯玛丽的宝贝
  • 捉鬼敢死队
  • 关于玛丽的事

名称:

  • 罗杰
  • 凯尔
  • 玛丽
  • 山姆

我想为所有与名称列表中的名称匹配的电影制作一个新列表。

  • 谁陷害了Roger Rabbit(匹配“ roger”)
  • 罗斯玛丽的宝贝(匹配“玛丽”)
  • 关于玛丽的事(匹配“玛丽”)

我曾尝试在Python中执行此操作,但由于某种原因,它无法正常工作。结果文件为空。

with open("movies.csv", "r") as movieList:
    movies = movieList.readlines()

with open("names.txt", "r") as namesToCheck:
    names = namesToCheck.readlines()

with open("matches.csv", "w") as matches:
    matches.truncate(0)

    for i in range(len(movies)):
        for j in range(len(names)):
            if names[j].lower() in movies[i].lower():
                matches.write(movies[i])
                break

    matches.close();

我在这里想念什么?

2 个答案:

答案 0 :(得分:1)

未获得任何结果的原因很可能是,当您在Python中的文件上调用readlines()时,它会为您提供每行的列表,并附有换行符\n结束。因此,您的程序将检查"roger\n"是否在电影文件中的一行中,而不仅仅是"roger"

要解决此问题,您只需在[:-1]语句中添加if即可仅检查名称,而不检查换行符:

if names[j].lower()[:-1] in movies[i].lower():

您还可以通过使用read().splitlines()来消除换行符,从而更改读取名称文件的方式,如下所示:

names = namesToCheck.read().splitlines()

答案 1 :(得分:1)

这有效....

Movies="""Independence Day
Who Framed Roger Rabbit
Rosemary's Baby
Ghostbusters
There's Something About Mary
"""

Names="""Roger
Kyle
Mary
Sam"""

with StringIO(Movies) as movie_file:
    movies=[n.strip().lower() for n in movie_file.readlines()]
with StringIO(Names) as name_file:
    names=[n.strip().lower() for n in name_file.readlines()]

for name in names:
    for film in movies:
        if film.find(name) is not -1:
            print("{:20s} {:40s}".format(name,film))

输出:

陷害罗杰兔子的罗杰
玛丽·罗斯玛丽的宝贝
玛丽关于玛丽的一些事情