【问题标题】:Find Substring Matches Between Two Files查找两个文件之间的子字符串匹配
【发布时间】:2019-11-27 23:25:49
【问题描述】:

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

电影:

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

姓名:

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

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

  • 谁陷害了兔子罗杰(匹配“罗杰”)
  • Rosemary 的宝宝(匹配“mary”)
  • 关于玛丽的事(匹配“玛丽”)

我尝试在 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();

我在这里错过了什么?

【问题讨论】:

  • 您的代码对我有用。您是否尝试打印出 moviesnames 并查看它们是否是正确的列表?
  • 请发布您的文件示例。

标签: python string list file match


【解决方案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))

输出:

陷害兔子罗杰的罗杰
玛丽迷迭香的宝贝
玛丽有一些关于玛丽的事情

【讨论】:

    【解决方案2】:

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

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

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

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

    names = namesToCheck.read().splitlines()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多