小编Ker*_*nic的帖子

使用Python CSV DictReader创建多层嵌套字典

总的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文件通常没有标题,但是为了尝试获得此功能的有效版本,我手动插入了标题行。理想情况下,将有一些分配标头的代码。

非常感谢任何帮助/指导/建议,谢谢!

python csv dictionary python-2.7

3
推荐指数
1
解决办法
4543
查看次数

如何在Python中创建异步HTTP GET请求并将响应对象传递给函数

更新:问题是文档不完整,事件调度程序将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'作为关键字参数发送; 得到一些有用的东西会很棒,所以如果有人有任何建议(使用问候或其他)请分享:)

提前致谢.

python asynchronous http python-requests

2
推荐指数
1
解决办法
5080
查看次数