如何在包含特定文本的文件夹中搜索文件并在Python中重命名该文件

如何在包含特定文本的文件夹中搜索文件并在Python中重命名该文件,python,filenames,Python,Filenames,我试图找到一个文件名,其中包含我使用列表传递的特定文本。我已经能够找到这些文件,但我似乎无法重命名它们。我不确定我做错了什么,所以任何帮助都将不胜感激。python非常新,所以只需要尝试一些简单的任务就可以了 from os import rename, listdir import fnmatch i = 0 divisions = ['BAT','FAB','HIN','OFA','SBY','VAL', 'FRE','JEF','OLA','SPR','WEB'

我试图找到一个文件名,其中包含我使用列表传递的特定文本。我已经能够找到这些文件,但我似乎无法重命名它们。我不确定我做错了什么,所以任何帮助都将不胜感激。python非常新,所以只需要尝试一些简单的任务就可以了

from os import rename, listdir
import fnmatch

i = 0
divisions = ['BAT','FAB','HIN','OFA','SBY','VAL',
             'FRE','JEF','OLA','SPR','WEB','CTV',
             'MOB','PET','SWN','DEN','GRE','MTJ',
             'ROS','SXB','DWT','HAI','OAK','RPB','TUL']

divs = listdir('.')
ending = " Financials.xlsx"

for div in divs:
    if fnmatch.fnmatch(div, divisions[i]):
        rename(div, divisions[i] + ending)
    i += 1

您的代码有两个问题。首先,
fnmatch
模式需要一个通配符来匹配文件名。第二,您只需要比较每个文件名的1个
分区
值,此时需要旋转所有分区,直到找到匹配项。修复这些问题会带来以下好处(我重命名了几个值,因为在文件列表为“divs”时有一个名为“divisions”的东西有点让人困惑)

如果你想将这一时间限制在2020年,这种模式将会改变。事实上,您根本不需要fnmatch,因为您知道确切的文件名

from os import rename, listdir

divisions = ['BAT','FAB','HIN','OFA','SBY','VAL',
             'FRE','JEF','OLA','SPR','WEB','CTV',
             'MOB','PET','SWN','DEN','GRE','MTJ',
             'ROS','SXB','DWT','HAI','OAK','RPB','TUL']
filename_map = dict(f"{division} Financials 2020.xlsx":f"{division} Finanacials.xlsx" 
    for division in divisions)

filenames = listdir('.')

for filename in filenames:
    mapped = filename_map.get(filename)
    if mapped:
        rename(filename, mapped)

出了什么问题?
if
是否查找文件?重命名是否正常运行?因为我们没有您的文件名,所以很难猜测问题出在哪里。该目录中的文件是否有标准格式?您可以运行一些测试,例如
fnmatch.fnmatch(“BAT Financials.xlsx”,“BAT”)
不匹配。抱歉,我不清楚。因此,脚本运行时不会出错,但文件名不会更改。例如,包含“BAT”的文件名为“BAT Financials 2020.xls”。我想把它改成“BAT Financials.xlsx”。但其他一些文件名中包含其他文本,例如:“2020”、“KPI”、“10月”。它们都包含一个标签,表示它们来自哪里,比如“BAT”,但我想将它们全部更改为统一的,比如“BAT Financials.xlsx”,所以[Divisions]+结尾。我不确定我是否给它喂食正确。我的理论是找到一个具有匹配除法字符串的文件名,然后对其进行更改。太棒了!代码中有几个问题,其中一个问题是fnmatch中没有包含通配符,因此没有匹配的内容。因为您知道所需文件的确切名称,所以不需要fnmatch。而你对循环的比较是错误的。我会写一个答案。太棒了!非常感谢@tdelaney!是的,我想是有通配符的,但我想可能是我的for循环不对。你真厉害!如果我只想在{division}上使用fnmatch模式,我会省略“Financials.xlsx”吗。因为我想捕获包含该单词的任何文件名。是的。您可以打开pythonshell并练习像
fnmatch(“batsomething.else”,“BAT*”)
这样的模式,看看会发生什么。
from os import rename, listdir

divisions = ['BAT','FAB','HIN','OFA','SBY','VAL',
             'FRE','JEF','OLA','SPR','WEB','CTV',
             'MOB','PET','SWN','DEN','GRE','MTJ',
             'ROS','SXB','DWT','HAI','OAK','RPB','TUL']
filename_map = dict(f"{division} Financials 2020.xlsx":f"{division} Finanacials.xlsx" 
    for division in divisions)

filenames = listdir('.')

for filename in filenames:
    mapped = filename_map.get(filename)
    if mapped:
        rename(filename, mapped)