如何使用Python重命名现有列表中的刮取文件

如何使用Python重命名现有列表中的刮取文件,python,regex,python-3.x,nlp,rename,Python,Regex,Python 3.x,Nlp,Rename,我正在从一个网站上抓取文件,并希望根据我计算机上现有的目录名(或者,如果更简单,包含这些目录名的列表)重命名这些文件。这是为了保持一致的命名约定 例如,我已经有了名为: Barone资本管理公司、Gabagool另类投资公司、Aprile资产管理公司、Webistics投资公司 刮取的数据包括一些精确匹配、一些“模糊”匹配和一些新值: Barone,Gabagool LLC,Aprile资产管理公司,新名称,Webistics投资公司 我希望被刮取的文件采用现有目录的命名约定。例如,Barone

我正在从一个网站上抓取文件,并希望根据我计算机上现有的目录名(或者,如果更简单,包含这些目录名的列表)重命名这些文件。这是为了保持一致的命名约定

例如,我已经有了名为:

Barone资本管理公司、Gabagool另类投资公司、Aprile资产管理公司、Webistics投资公司

刮取的数据包括一些精确匹配、一些“模糊”匹配和一些新值:

Barone,Gabagool LLC,Aprile资产管理公司,新名称,Webistics投资公司

我希望被刮取的文件采用现有目录的命名约定。例如,
Barone
将成为
Barone Capital Management
Gabagool LLC
将更名为
Gabagool Alternative Investments

那么,实现这一目标的最佳方式是什么?我查看了fuzzyfuzzy和其他一些库,但不确定正确的路径是什么

这是我现有的代码,它只是根据锚点命名文件:

import praw
import requests
from bs4 import BeautifulSoup
import urllib.request

url = 'https://old.reddit.com/r/test/comments/b71ug1/testpostr23432432/'
headers = {'User-Agent': 'Mozilla/5.0'}
page = requests.get(url, headers=headers)

soup = BeautifulSoup(page.text, 'html.parser')
table = soup.find_all('table')[0]

#letter_urls = []
for anchor in table.findAll('a'):
    try:
        if not anchor:
            continue
        fund_name = anchor.text
        letter_link = anchor['href']
        urllib.request.urlretrieve(letter_link, '2018 Q4 ' + fund_name + '.pdf')
    except:
        pass
请注意,目录列表已创建,如下所示:

 - /Users/user/Dropbox/Letters/Barone Capital Management
 - /Users/user/Dropbox/Letters/Aprile Asset Management
 - /Users/user/Dropbox/Letters/Webistics Investments
 - /Users/user/Dropbox/Letters/Gabagool Alternative Investments
 - /Users/user/Dropbox/Letters/Ro Capital
 - /Users/user/Dropbox/Letters/Vitoon Capital
如在

可以使用difflib.get\u close\u matches()查找列表中最相似的字符串。您的列表将是您已经拥有的绝对路径的文件夹:

import difflib
best_options = get_close_matches(fund_name, candidates, n=1)

if best_options:
    directory = best_options[0]
else:
    directory = 'New Name'
让它工作起来:

best_options = get_close_matches(fund_name, candidates, n=1, cutoff=.5)

try:
     if best_options:
       fund_name = (downloads_folder + period + " " + fund_name + ".pdf")
       os.rename(fund_name, downloads_folder + period + " " + best_options[0] + ".pdf" )
    except:
        pass

FuzzyWozzy看起来很有趣,谢谢!有一个非常类似的问题。Windows、Linux或Mac?其次,您如何确定希望他们进入哪个文件夹?我没有看到你代码中的下载目录列表。第三,您是否已经制定了下载指令。Mac 2。我还没有决定,因为我认为它更适合单独发布。但很明显,我们希望这样做,使被刮取的文件找到匹配的目录,重命名,然后移动到该目录。3.是的,它们已经制作好了。那么
候选目录
是现有目录的列表吗?也许我遗漏了一些明显的东西,但我一直得到
name'get\u close\u matches'没有定义
,即使我导入了difflib。是否还有其他模块需要导入?很抱歉,如果是一个愚蠢的问题,因为我对这个问题很陌生。您必须添加“从difflib导入get_close_匹配”,这也是我根据difflib.get_close_匹配的示例所想的。因此,我提出了一种方法,即在粗略的名称中查看唯一的单词,而忽略一般的单词,如投资、资产、管理等@MSD问题是空格将匹配搞砸了。从候选文件和文件名中删除空格,然后像这样比较它们。您将拥有最佳目录的无空间版本,但通过使用它在候选目录列表中的索引,您可以轻松获得原始名称。如果仍然得不到任何结果,请使用'cutoff'参数来放松算法的精度,因为默认情况下它必须超过0.6:difflib.get_close_matches('asset123',['AssetManagement','WebisticsInvestments',],n=1,cutoff=0.3),实际上,只要放松精度,我尝试的示例就会得到一些结果。检查一下你自己