如何 return 元组中的哪个元素在 endswith 函数中匹配

How to return which element from the tuple matched in the endswith function

我正在尝试使用 Python 进行文件重命名。我能够成功地从维基百科上抓取剧集列表,但在制作重命名文件时遇到了很多差异。我想要的是,我想完全使用与 if 条件匹配的扩展名,而不是最后的“.mkv”。有没有办法return呢?

extensions = ('.webm','.mkv','.flv','.vob','.ogv', 
  '.ogg','.drc','.gif','.gifv','.mng','.avi','.mov', 
  '.qt','.wmv','.yuv','.rm','.rmvb','.asf','.amv','.mp4',
  '.m4p', '.m4v','.mpg', '.mp2', '.mpeg', '.mpe', '.mpv',
  '.mpg', '.mpeg', '.m2v','.m4v','.svi','.3gp','.3g2','.mxf',
  '.roq','.nsv','.f4v', '.f4p', '.f4a' ,'.f4b','.srt')
list = f.readlines()


y = 0
num = 1
for filename in os.listdir(path):
    if filename.endswith(extensions):
      os.rename(path+"\"+filename,path+"\"+str(num)+' - '+list[int(y)].strip('\n')+'.mkv') #instead of mkv, I want extension which was matched in the above if condition. 
    y += 1
    num += 1

好吧,要么你必须一个一个地遍历扩展名,要么你可以拆分文件名来获得扩展名。

按文件名拆分

for filename in os.listdir(path):
    if filename.endsswith(extensions):
        extension = filename.split('.')[-1] # you can use os.path.splitext too as Max Chretien suggested
        # ...

使用显式循环

for filename in os.listdir(path):
    matching_extensions = filter(lambda extension: filename.endswith(extension), extensions)
    if matching_extensions:
        extension = matching_extensions[0]
    # ...

另一个线索,首先我将使用 os.path.splitext.

提取 filenamefile_extension

然后,如果 file_extension 与您的 extensions 元组匹配,我将用 try except 重命名它以查看是否有任何错误。

for file_path in os.listdir(path):
    filename, file_extension = os.path.splitext(file_path)
    if file_extension in extensions:
      try:
          os.rename(file_path, filename + '.mkv')
      except OSError:
          print("Error while renaming {}".format(filename))

如果我对你的问题的理解正确,下面的代码可能会起作用。

extensions = ('.webm','.mkv','.flv','.vob','.ogv', 
  '.ogg','.drc','.gif','.gifv','.mng','.avi','.mov', 
  '.qt','.wmv','.yuv','.rm','.rmvb','.asf','.amv','.mp4',
  '.m4p', '.m4v','.mpg', '.mp2', '.mpeg', '.mpe', '.mpv',
  '.mpg', '.mpeg', '.m2v','.m4v','.svi','.3gp','.3g2','.mxf',
  '.roq','.nsv','.f4v', '.f4p', '.f4a' ,'.f4b','.srt')
list = f.readlines()


y = 0
num = 1
for filename in os.listdir(path):
    if ('.'+filename.lower().split('.')[1]) in list(extensions):
        os.rename(path+"\"+filename,path+"\"+str(num)+' - '+list[int(y)].strip('\n')+'.mkv')
    y += 1
    num += 1

我刚刚对您的代码做了一点小改动。

来自:if filename.endswith(extensions):

至:if ('.'+filename.lower().split('.')[1]) in list(extensions):

希望对您有所帮助!