关于查找两个字典交集的最佳方法的建议
Advice on the best way to find intersection of two dictionaries
我之前发过一个类似的问题,但是在修改项目之后,我得到了这里:
有两个 csv 文件 (new.csv, scrapers.csv) -
new.csv 包含一个列:
'urls' = 整URLs
scrapers.csv 包含两列:
'scraper_dom' = 特定 URL 域的简化
'scraper_id' = 关联的 scraper_id,用于将 URL 导入单独管理的数据库
问题
我的目标是遍历 new.csv(使用 urlparse
解析 fnetloc
)并执行 lookup on scrapers.csv 到 return 一组匹配 'scraper_id' 给定的一组'urls'(VLOOKUP 的工作方式,或 SQL 中的 JOIN),一旦 urlparse
将 netloc 隔离在URL(fnetloc
的结果)。
我的下一个大问题是 urlparse
没有将 URL(从 new.csv)解析为在scrapers.csv 文件,所以我会依赖于某种 部分匹配 直到我找出要使用的正则表达式对于它的那一部分。
我已经导入了 pandas
,因为之前的尝试发现我创建了 DataFrames 并执行了 pd.merge
但我也无法让它工作...
当前代码,底部注释掉的部分是失败的尝试,只是想我会包括到目前为止我已经尝试过的内容。
(##
只是我输入的中间 print
行来检查程序的输出)
import pandas as pd, re
from urllib.parse import urlparse
import csv
sd = {}
sid = {}
#INT = []
def fnetloc(any):
try:
p = urlparse(any)
return p.netloc
except IndexError:
return 'Error'
def dom(any):
try:
r = any.split(',')
return r[0]
except IndexError:
return 'Error'
def ids(any):
try:
e = any.split(',')
return e[0]
except IndexError:
return 'Error'
with open('scrapers.csv',encoding='utf-8',newline='') as s:
reader = enumerate(csv.reader(s))
s.readline()
for j, row in reader:
dict1 = dict({'scraper_dom':dom(row[0]), 'scraper_id':ids(row[1])})
sid[j + 1] = dict1
for di in sid.keys():
id = di
##print(sid[di]['scraper_dom'],sid[di]['scraper_id'])
with open('new.csv',encoding='UTF-8',newline='') as f:
reader = enumerate(csv.reader(f))
f.readline()
for i, row in reader:
dict2 = dict({'scraper_domain': fnetloc(row[0])})
sd[i + 1] = dict2
for d in sd.keys():
id = d
##print(sd[d]['scraper_domain'])
#def tryme( ):
#return filter(sd.has_key, sid)
#print(list(filter(sid, sd.keys())))
所需输出的示例。
你只需要一个程序,它可以获取一个 fnetloc 和一个抓取器列表,并检查是否有一个抓取器与那个 fnetloc 相匹配:
def fnetloc_to_scraperid(fnetloc: str, scrapers: List[Scraper]) -> str:
try:
return next(x.scraper_id for x in scrapers if x.matches(fnetloc))
except:
return "[no scraper id found]"
我还建议您使用一些 类 而不是将所有内容都保存在 csv 行对象中——它减少了代码中的错误,在长 运行 中,并且大大提高了您的理智。
此脚本处理我提供给它的示例数据:
import csv
from urllib.parse import urlparse
from typing import List
def fnetloc(any) -> str:
try:
p = urlparse(any)
return p.netloc
except IndexError:
return 'Error'
class Scraper:
def __init__(self, scraper_dom: str, scraper_id: str):
self.scraper_dom = scraper_dom
self.scraper_id = scraper_id
def matches(self, fnetloc: str) -> bool:
return fnetloc.endswith(self.scraper_dom)
class Site:
def __init__(self, url: str):
self.url = url
self.fnetloc = fnetloc(url)
def get_scraperid(self, scrapers: List[Scraper]) -> str:
try:
return next(x.scraper_id for x in scrapers if x.matches(self.fnetloc))
except:
return "[no scraper id found]"
sites = [Site(row[0]) for row in csv.reader(open("new.csv"))]
scrapers = [Scraper(row[0], row[1]) for row in csv.reader(open("scrapers.csv"))]
for site in sites:
print(site.url, site.get_scraperid(scrapers), sep="\t")
我之前发过一个类似的问题,但是在修改项目之后,我得到了这里:
有两个 csv 文件 (new.csv, scrapers.csv) -
new.csv 包含一个列:
'urls' = 整URLs
scrapers.csv 包含两列:
'scraper_dom' = 特定 URL 域的简化
'scraper_id' = 关联的 scraper_id,用于将 URL 导入单独管理的数据库
问题
我的目标是遍历 new.csv(使用 urlparse
解析 fnetloc
)并执行 lookup on scrapers.csv 到 return 一组匹配 'scraper_id' 给定的一组'urls'(VLOOKUP 的工作方式,或 SQL 中的 JOIN),一旦 urlparse
将 netloc 隔离在URL(fnetloc
的结果)。
我的下一个大问题是 urlparse
没有将 URL(从 new.csv)解析为在scrapers.csv 文件,所以我会依赖于某种 部分匹配 直到我找出要使用的正则表达式对于它的那一部分。
我已经导入了 pandas
,因为之前的尝试发现我创建了 DataFrames 并执行了 pd.merge
但我也无法让它工作...
当前代码,底部注释掉的部分是失败的尝试,只是想我会包括到目前为止我已经尝试过的内容。
(##
只是我输入的中间 print
行来检查程序的输出)
import pandas as pd, re
from urllib.parse import urlparse
import csv
sd = {}
sid = {}
#INT = []
def fnetloc(any):
try:
p = urlparse(any)
return p.netloc
except IndexError:
return 'Error'
def dom(any):
try:
r = any.split(',')
return r[0]
except IndexError:
return 'Error'
def ids(any):
try:
e = any.split(',')
return e[0]
except IndexError:
return 'Error'
with open('scrapers.csv',encoding='utf-8',newline='') as s:
reader = enumerate(csv.reader(s))
s.readline()
for j, row in reader:
dict1 = dict({'scraper_dom':dom(row[0]), 'scraper_id':ids(row[1])})
sid[j + 1] = dict1
for di in sid.keys():
id = di
##print(sid[di]['scraper_dom'],sid[di]['scraper_id'])
with open('new.csv',encoding='UTF-8',newline='') as f:
reader = enumerate(csv.reader(f))
f.readline()
for i, row in reader:
dict2 = dict({'scraper_domain': fnetloc(row[0])})
sd[i + 1] = dict2
for d in sd.keys():
id = d
##print(sd[d]['scraper_domain'])
#def tryme( ):
#return filter(sd.has_key, sid)
#print(list(filter(sid, sd.keys())))
所需输出的示例。
你只需要一个程序,它可以获取一个 fnetloc 和一个抓取器列表,并检查是否有一个抓取器与那个 fnetloc 相匹配:
def fnetloc_to_scraperid(fnetloc: str, scrapers: List[Scraper]) -> str:
try:
return next(x.scraper_id for x in scrapers if x.matches(fnetloc))
except:
return "[no scraper id found]"
我还建议您使用一些 类 而不是将所有内容都保存在 csv 行对象中——它减少了代码中的错误,在长 运行 中,并且大大提高了您的理智。
此脚本处理我提供给它的示例数据:
import csv
from urllib.parse import urlparse
from typing import List
def fnetloc(any) -> str:
try:
p = urlparse(any)
return p.netloc
except IndexError:
return 'Error'
class Scraper:
def __init__(self, scraper_dom: str, scraper_id: str):
self.scraper_dom = scraper_dom
self.scraper_id = scraper_id
def matches(self, fnetloc: str) -> bool:
return fnetloc.endswith(self.scraper_dom)
class Site:
def __init__(self, url: str):
self.url = url
self.fnetloc = fnetloc(url)
def get_scraperid(self, scrapers: List[Scraper]) -> str:
try:
return next(x.scraper_id for x in scrapers if x.matches(self.fnetloc))
except:
return "[no scraper id found]"
sites = [Site(row[0]) for row in csv.reader(open("new.csv"))]
scrapers = [Scraper(row[0], row[1]) for row in csv.reader(open("scrapers.csv"))]
for site in sites:
print(site.url, site.get_scraperid(scrapers), sep="\t")