总的Python noob在这里,可能缺少明显的东西。我到处搜索,还没有找到解决方案,所以我想寻求帮助。
我正在尝试编写一个从大型csv文件构建嵌套字典的函数。输入文件的格式如下:
Product,Price,Cost,Brand,
blue widget,5,4,sony,
red widget,6,5,sony,
green widget,7,5,microsoft,
purple widget,7,6,microsoft,
Run Code Online (Sandbox Code Playgroud)
等等...
我需要的输出字典如下所示:
projects = { `<Brand>`: { `<Product>`: { 'Price': `<Price>`, 'Cost': `<Cost>` },},}
Run Code Online (Sandbox Code Playgroud)
但是很明显,许多不同的品牌都包含不同的产品。在输入文件中,数据按品牌名称的字母顺序排序,但是我知道,一旦执行DictReader,数据就会变得无序,因此,我绝对需要一种更好的方式来处理重复项。编写的if语句是多余的,也是不必要的。
这是到目前为止我无法使用的无用代码:
def build_dict(source_file):
projects = {}
headers = ['Product', 'Price', 'Cost', 'Brand']
reader = csv.DictReader(open(source_file), fieldnames = headers, dialect = 'excel')
current_brand = 'None'
for row in reader:
if Brand != current_brand:
current_brand = Brand
projects[Brand] = {Product: {'Price': Price, 'Cost': Cost}}
return projects
source_file = 'merged.csv'
print build_dict(source_file)
Run Code Online (Sandbox Code Playgroud)
我当然已经在文件顶部导入了csv模块。
最好的方法是什么?我觉得我的路还很遥远,但是关于从CSV创建嵌套字典的信息很少,而且那里的示例非常具体,往往不会详细说明该解决方案为何有效,因此作为Python的新手,很难下结论。
另外,输入的csv文件通常没有标题,但是为了尝试获得此功能的有效版本,我手动插入了标题行。理想情况下,将有一些分配标头的代码。
非常感谢任何帮助/指导/建议,谢谢!
更新:问题是文档不完整,事件调度程序将kwargs传递给钩子函数.
我有一个大约30k网址的列表,我想检查各种字符串.我使用Requests&BeautifulSoup有一个这个脚本的工作版本,但它不使用线程或异步请求所以它非常慢.
最后我想要做的是为每个URL缓存html,这样我就可以运行多次检查,而不会向每个站点发出冗余的HTTP请求.如果我有一个存储html的函数,那么异步发送HTTP GET请求然后传递响应对象的最佳方法是什么?
我一直在尝试使用Grequests(如此处所述)和"hooks"参数,但我收到错误,文档也没有深入.所以我希望有更多经验的人可以解释一下.
这是我想要完成的一个简化示例:
import grequests
urls = ['http://www.google.com/finance','http://finance.yahoo.com/','http://www.bloomberg.com/']
def print_url(r):
print r.url
def async(url_list):
sites = []
for u in url_list:
rs = grequests.get(u, hooks=dict(response=print_url))
sites.append(rs)
return grequests.map(sites)
print async(urls)
Run Code Online (Sandbox Code Playgroud)
它会产生以下TypeError:
TypeError: print_url() got an unexpected keyword argument 'verify'
<Greenlet at 0x32803d8L: <bound method AsyncRequest.send of <grequests.AsyncRequest object at 0x00000000028D2160>>
(stream=False)> failed with TypeError
Run Code Online (Sandbox Code Playgroud)
不确定为什么它默认将'verify'作为关键字参数发送; 得到一些有用的东西会很棒,所以如果有人有任何建议(使用问候或其他)请分享:)
提前致谢.