【问题标题】:Python: Find substring in list of stringPython:在字符串列表中查找子字符串
【发布时间】:2023-04-03 03:22:01
【问题描述】:

我有两个列表:songs 是歌曲名称列表,filenames 是通过运行 os.listdir() 生成的歌曲 MP3 文件列表。

songs = ['The Prediction', 'Life We Chose', 'Nastradamus', 'Some of Us Have Angels', 'Project Windows', 'Come Get Me', "Shoot 'em Up", 'Last Words', 'Family', 'God Love Us', 'Quiet Niggas', 'Big Girl', 'New World', 'You Owe Me', 'The Outcome']

每首歌曲都是 unicode。

filenames = ['Nas - Big Girl.mp3', 'Nas - Come Get Me.mp3', 'Nas - God Love Us.mp3', 'Nas - Life We Chose.mp3', 'Nas - Nastradamus.mp3', 'Nas - New World.mp3', "Nas - Shoot 'Em Up.mp3", 'Nas - Some of Us Have Angels.mp3', 'Nas - The Outcome.mp3', 'Nas - The Prediction.mp3', 'Nas Feat. Bravehearts - Quiet Niggas.mp3', 'Nas Feat. Ginuwine - You Owe Me.mp3', 'Nas Feat. Mobb Deep - Family.mp3', 'Nas Feat. Nashawn - Last Words.mp3', 'Nas Feat. Ronald Isley - Project Windows.mp3']

每个文件名都是一个字符串。

我希望能够查看songs 列表,如果songs 列表中的一项与filenames 列表中的项目匹配,则将文件重命名为歌曲的文件。

【问题讨论】:

  • 是的,这是有道理的。你试过什么?
  • 不,这没有意义。你期望结果是什么?描述你最终会得到的变量以及文件夹应该包含的文件名。
  • 您似乎只是想从某些 mp3 中删除艺术家姓名,在这种情况下,您可以使用 ID3-TagIt 之类的东西并从 ID3 标签生成新文件名。作为奖励,这将防止出现 "Shoot 'em Up""Shoot 'Em Up" 之类的错误。
  • 你不关心"Nas - Shoot 'Em Up.mp3"不被改变吗?因为发布的答案都没有考虑到这一点。

标签: python regex string substring matching


【解决方案1】:

这里的版本将保留文件扩展名,无论它是什么,并且通过在匹配后将其从filenames 数组中删除来避免相同的文件名被匹配两次。它也不区分大小写:

for song in songs:
    for i, filename in enumerate(filenames):
        if song.upper() in filename.upper():
            os.rename(filename, song + os.path.splitext(filename)[1])
            del filenames[i]
            break

您也可以先循环遍历文件名,但问题也可能是两个文件名与同一首歌曲匹配,rename 操作将在第二个时引发错误。因此,在该设置中,一旦歌曲与文件名匹配,您最好将其从歌曲列表中删除。

【讨论】:

  • 好点!从来没想过。我将你的标记为答案。谢谢!
  • 不客气 ;-) 不知道为什么有人不赞成这个,但我还添加了 .upper() 以使比较不区分大小写。
  • 我没有投反对票。我很清楚这是谁,因为这家伙系统地对“简单”问题的有效答案投了反对票,认为这很容易代表,并对这里的所有工作答案投了反对票。 Buuuuuut 它不起作用。看一下这个。 +1
【解决方案2】:

按照您的方式定义列表后,您希望遍历每个文件,然后根据每个歌曲名称检查它。它应该看起来像这样:

for f in filenames:
    for s in songs:
        if s in f:
            os.rename(f,s+".mp3")

这样,文件也保留了 mp3 扩展名。

【讨论】:

  • 这是迄今为止最好、最直接的答案。谢谢!
  • 很久没有看到第一篇解释得当、格式正确的帖子了,+1。
  • @Jean-FrançoisFabre 非常感谢! :)
  • 德纳达。继续这样做!
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 2018-09-27
  • 2021-08-13
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多